从多个线程写入不同文件后获取error()

时间:2013-02-11 21:53:00

标签: c file file-io

我正在尝试生成几个线程,并为每个线程写入不同的文件(线程1写入文件1等等)。但是,在线程执行ferror()设置后,阻止我在主进程中进行进一步的文件操作。我尝试清除错误,但它没有解决。这是我目前的代码:

#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>

void * bla (void *arg) {
    fprintf((FILE *) arg, "Hey, printing to file");
}

int main() {
    FILE *f1 = fopen("out0", "rw");
    FILE *f2 = fopen("out1", "rw");

    pthread_t t[2];
    pthread_create(&t[0], NULL, bla, f1);
    pthread_create(&t[1], NULL, bla, f2);

    pthread_join(t[0], NULL);
    pthread_join(t[1], NULL);
    printf("%d\n", ferror(f2));   // ERROR: ferror() is set to 1 here!

    //fseek(f1, 0, SEEK_END);
    fseek(f2, 0, SEEK_END);
    long pos = ftell(f2);         // This still works
    printf("%ld\n", pos);
    clearerr(f2);                 // Trying to clear the error, flag clears, but further operations fail
    char *bytes = malloc(pos);
    int err = fread(bytes, 1, 4, f2);  // fread returns 0
    printf("%d\n", ferror(f2));
    printf("%d\n", err);
    bytes[pos-1] = '\0';
    printf("%s", bytes);
    free (bytes);

    fclose(f1);
    fclose(f2);

    return 0;

请注意,线程打开的文件不应存在,如果存在,则应清除该文件。 任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:2)

mode的{​​{1}}参数应该是fopen(如果文件应该存在)或"r+"(或者甚至可能是"w+")而不是{{1} }}。字符"a+"可能不是有效模式,可能会被解释为"rw"模式,您不能"rw""r"