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