Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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 输出文件的随机写入顺序?_C_File_Pointers_Output_Fseek - Fatal编程技术网

C 输出文件的随机写入顺序?

C 输出文件的随机写入顺序?,c,file,pointers,output,fseek,C,File,Pointers,Output,Fseek,我已经写了一个程序,将信息写入文件。文件的输出顺序与我期望的不一致。我有一个标题行和三个额外的数字信息行。页眉位于第一行,然后是第三行、第一行和第二行 请注意,文件是在a模式下打开的,而不是a+。根据各种来源,像fseek()这样的重新定位操作符应该被忽略。有一段时间,我实际上得到了第三行,在这一行被写之前第一行。如果省略fseek()行,则第三行实际上写在标题之前 如果fseek()函数保留注释(无论处于a或a+模式),输出如下图所示 我写了一些代码,看看应该如何编写输出。文件中的文本肯定不是

我已经写了一个程序,将信息写入文件。文件的输出顺序与我期望的不一致。我有一个标题行和三个额外的数字信息行。页眉位于第一行,然后是第三行、第一行和第二行

请注意,文件是在
a
模式下打开的,而不是
a+
。根据各种来源,像
fseek()
这样的重新定位操作符应该被忽略。有一段时间,我实际上得到了第三行,在这一行被写之前第一行。如果省略
fseek()
行,则第三行实际上写在标题之前

如果
fseek()
函数保留注释(无论处于
a
a+
模式),输出如下图所示

我写了一些代码,看看应该如何编写输出。文件中的文本肯定不是它应该是的

我尝试在每次写入之前使用
fseek()
函数查找EOF之前的位置,但没有成功

我还注意到,如果我使用
fflush(writeP)
,那么我会得到与包含
fseek()
函数相同的效果。如图所示,文件仍处于无序状态,但第三行不再位于标题行之前。

我错过了什么

void quickSortHelper(int* num, long startTime, long endTime, int size){
FILE *writeP = fopen(QUICKSORT_FILE, "a");
    if(writeP == NULL){
        fputs("Error opening file\n", stderr);
        exit(1);
    }

static int times = 0;
long deltaT; //change in time

if(size < STEPSIZE){//first time, write header to file
    printf("Writing header!\n");
    fprintf(writeP, " --- QUICKSORT ---\nCOUNT\tTIME\tMEDIAN\n");
}

deltaT = (clock() - startTime)/(CLOCKS_PER_SEC/1000);
//fflush(writeP);
fseek(writeP, -1, SEEK_END);

printf("Writing: %d\t%ld\t%d\n", size, deltaT, findMedian(num, size));
fprintf(writeP, "%d\t%ld\t%d\n", size, deltaT, findMedian(num, size));

if(++times == 3)
    fclose(writeP);

return;
void quickSortHelper(int*num,long startTime,long endTime,int size){
文件*writeP=fopen(快速排序文件,“a”);
如果(writeP==NULL){
fputs(“打开文件时出错”,stderr);
出口(1);
}
静态整数倍=0;
long deltaT;//随时间变化
如果(size
}

注释了
fseek()
行后,输出为:


调用函数时,前3次不关闭
writeP
。因此,文件由几个
文件
句柄打开,这些句柄在退出时关闭。
“a”
仅适用于相同的
文件
句柄或数据到达磁盘时。

调用函数时,前3次不关闭
writeP
。因此,文件由几个
文件
句柄打开,这些句柄在退出时关闭。
“a”
仅适用于相同的
文件
句柄或数据到达磁盘时。

调用函数时,前3次不关闭
writeP
。因此,文件由几个
文件
句柄打开,这些句柄在退出时关闭。
“a”
仅适用于相同的
文件
句柄或数据到达磁盘时。

调用函数时,前3次不关闭
writeP
。因此,文件由几个
文件
句柄打开,这些句柄在退出时关闭。
“a”
仅适用于相同的
文件
句柄,或者当数据到达磁盘时才起作用。

问题在于,您在每次函数调用时都打开相同的文件,但仅在第三次调用时才将其关闭。我建议将文件打开和关闭逻辑移出该函数,并将
文件*
句柄作为参数传递给该函数;这样也可以避免硬编码要关闭该函数的呼叫号码

因此,调用函数的位置如下所示:

FILE *writeP = fopen(QUICKSORT_FILE, "w"); // "a" changed to "w"
if (!writeP) {
    perror(QUICKSORT_FILE);
    exit(1);
}
// perhaps write the header into the file here
for (int i = 0; i < 3; ++i) {
    // do the quicksort
    write_quicksort_results(writeP, …);
}
(void) fclose(writeP);
FILE*writeP=fopen(快速排序文件,“w”);//“a”改为“w”
如果(!writeP){
perror(快速排序文件);
出口(1);
}
//也许在这里将头写入文件
对于(int i=0;i<3;++i){
//进行快速排序
写入快速排序结果(写入,…);
}
(无效)fclose(书面);

问题来自这样一个事实:在每次函数调用时打开同一个文件,但只在第三次调用时关闭它。我建议将文件打开和关闭逻辑移出该函数,并将
文件*
句柄作为参数传递给该函数;这样也可以避免硬编码要关闭该函数的呼叫号码

因此,调用函数的位置如下所示:

FILE *writeP = fopen(QUICKSORT_FILE, "w"); // "a" changed to "w"
if (!writeP) {
    perror(QUICKSORT_FILE);
    exit(1);
}
// perhaps write the header into the file here
for (int i = 0; i < 3; ++i) {
    // do the quicksort
    write_quicksort_results(writeP, …);
}
(void) fclose(writeP);
FILE*writeP=fopen(快速排序文件,“w”);//“a”改为“w”
如果(!writeP){
perror(快速排序文件);
出口(1);
}
//也许在这里将头写入文件
对于(int i=0;i<3;++i){
//进行快速排序
写入快速排序结果(写入,…);
}
(无效)fclose(书面);

问题来自这样一个事实:在每次函数调用时打开同一个文件,但只在第三次调用时关闭它。我建议将文件打开和关闭逻辑移出该函数,并将
文件*
句柄作为参数传递给该函数;这样也可以避免硬编码要关闭该函数的呼叫号码

因此,调用函数的位置如下所示:

FILE *writeP = fopen(QUICKSORT_FILE, "w"); // "a" changed to "w"
if (!writeP) {
    perror(QUICKSORT_FILE);
    exit(1);
}
// perhaps write the header into the file here
for (int i = 0; i < 3; ++i) {
    // do the quicksort
    write_quicksort_results(writeP, …);
}
(void) fclose(writeP);
FILE*writeP=fopen(快速排序文件,“w”);//“a”改为“w”
如果(!writeP){
perror(快速排序文件);
出口(1);
}
//也许在这里将头写入文件
对于(int i=0;i<3;++i){
//进行快速排序
写入快速排序结果(写入,…);
}
(无效)fclose(书面);

问题来自这样一个事实:在每次函数调用时打开同一个文件,但只在第三次调用时关闭它。我建议将文件打开和关闭逻辑移出该函数,并将
文件*
句柄作为参数传递给该函数;这样也可以避免