我编写了一个将信息写入文件的程序。文件的输出不是我期望的顺序。我有一个标题行和另外三行数字信息。首先是第三行,第一行和第二行。
请注意,该文件以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;
}
在fseek()
行注释后,输出为:
答案 0 :(得分:2)
调用函数时,前3次不关闭writeP
。因此,该文件由几个FILE
句柄打开,这些句柄在退出时关闭。 "a"
仅适用于相同的FILE
句柄或数据已到达磁盘。
答案 1 :(得分:1)
问题来自于您在每次函数调用时打开相同的文件,但只在第三次调用时关闭它。我建议将文件打开和关闭逻辑移出该函数,并将FILE *
句柄作为参数传递给函数;这也可以避免硬编码接近该功能的电话号码。
所以你调用函数的地方看起来像这样:
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);