如何强制fseek()移动光标

时间:2012-12-29 11:36:21

标签: c gcc stdio

我有一个创建多个线程的程序,每个线程都尝试在不同位置(偏移量)的文件中写入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);

1 个答案:

答案 0 :(得分:4)

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

来自fopen的POSIX参考:

  

打开带有追加模式的文件(作为mode参数中的第一个字符)将导致对文件的所有后续写入被强制转移到当前的文件结尾,无论对fseek的中间调用如何()

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