随机写入命令输出文件?

时间:2013-11-21 22:58:55

标签: c file pointers output fseek

我编写了一个将信息写入文件的程序。文件的输出不是我期望的顺序。我有一个标题行和另外三行数字信息。首先是第三行,第一行和第二行。

请注意,该文件以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;

}

enter image description here

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

enter image description here

2 个答案:

答案 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);