Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何强制fseek()移动光标_C_Gcc_Stdio - Fatal编程技术网

C 如何强制fseek()移动光标

C 如何强制fseek()移动光标,c,gcc,stdio,C,Gcc,Stdio,我有一个程序,它创建多个线程,每个线程都试图在一个文件中的不同位置(偏移量)写入100字节。 第一个线程从0开始写入100字节,第二个线程从100开始写入100字节,第三个线程从300开始写入100字节,依此类推 如果线程是按这个顺序执行的,那么一切都可以,我不需要fseek。但对于实时并发性,如果我将第一个线程置于“睡眠(2)”状态2秒钟,等待所有其他线程完成,然后使用fseek将文件光标移动到文件的开头,则不会发生这种情况。 我使用互斥来处理并发性。 代码示例: offset=0;/

我有一个程序,它创建多个线程,每个线程都试图在一个文件中的不同位置(偏移量)写入100字节。 第一个线程从0开始写入100字节,第二个线程从100开始写入100字节,第三个线程从300开始写入100字节,依此类推 如果线程是按这个顺序执行的,那么一切都可以,我不需要fseek。但对于实时并发性,如果我将第一个线程置于“睡眠(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);

如果不打算只附加到文件,请不要在附加模式下打开该文件

从POSIX参考中:

使用append模式(模式参数中的第一个字符是a)打开文件将导致对文件的所有后续写入都被强制到文件的当前结尾,,而不考虑对fseek()的中间调用。


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

如果您不打算只附加到文件,请不要在附加模式下打开该文件

从POSIX参考中:

使用append模式(模式参数中的第一个字符是a)打开文件将导致对文件的所有后续写入都被强制到文件的当前结尾,,而不考虑对fseek()的中间调用。

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