1

我有一个创建多个线程的程序,每个线程都尝试在不同位置(偏移量)的文件中写入 100 个字节。第一个线程从 0 开始写入 100 个字节,第二个从 100 开始写入 100 个字节,第三个从 300 开始写入 100 个字节,依此类推如果线程按此顺序执行,一切正常,我不需要 fseek。但是对于实时并发,如果我将第一个线程置于“sleep(2)”状态 2 秒,等到所有其他线程完成,然后使用 fseek 将文件光标移动到文件的开头,这不会发生。我使用互斥锁来处理并发。代码示例:

    offset=0;//for the first thread
    char data[100];
    int length; // how many chars are currently in data
    FILE * f;

    pthread_mutex_lock(&mutexFileWrite);
    f = fopen(fileName, "a");
    fseek(f,offset, SEEK_SET);  
    fwrite(data,sizeof(char),length,f);
    fclose(f);
    pthread_mutex_unlock(&mutexFileWrite);
4

1 回答 1

4

如果您不打算仅追加文件,请不要以追加模式打开文件。

从 POSIX 参考fopen

打开带有附加模式的文件(a 作为模式参数中的第一个字符)将导致对文件的所有后续写入被强制到当时的当前文件结尾,而不管对 fseek() 的干预调用

看起来你正在寻找r+模式。

于 2012-12-29T11:46:06.170 回答