我从来没有意识到这一点。我本可以下意识地假设一个很难的事实,即我可以在现有文件的读写之间转换打开它的更新模式,就像那样。但是关于 SO( 1,2 )的两个问题驱使我持怀疑态度,我决定尝试一下。这是我发现的:
在第一个程序中prog1
,我处理一个source.txt
只有行致命武器的文件。我阅读了第一个世界致命武器,fscanf()
并打算在之后写“火枪”,期望得到致命火枪。但它根本失败,我仍然在写入操作结束时获取原始内容致命武器fseek(fp,0,SEEK_CUR)
。但是在第一个程序中,如果我插入行,写入操作工作正常,我得到致命火枪。我注意到fseek(fp,0,SEEK_CUR)
除了调用之外没有其他fseek()
用途其中,因为根本没有寻网。
但是在第二个程序中prog2
,相同的场景不需要该fseek(fp,0,SEEK_CUR)
语句。确切地说,在第二个程序中,与在第一个程序中读取文件中间相反,这里我读取到文件末尾,然后开始写作。这里即使不使用也能成功写入fseek(fp,0,SEEK_CUR)
,我得到了想要的内容致命武器销售。
问题:为什么我们不能在文件中间从模式转换read
到模式?让它工作有什么不同?同时,如果我们读取到文件末尾并在那里写入,为什么相同的转换工作没有任何大惊小怪?为什么在第二种情况下不需要?我在第一个程序中使写入成功的建议有多大?还有更好的选择吗?write
fseek(fp,0,SEEK_CUR)
fseek(fp,0,SEEK_CUR)
fseek(fp,0,SEEK_CUR)
关于 SO 的两个问题似乎在某种程度上解决了同一个问题,但是由于它们更多地基于寻求对文本/书籍摘录的解释,因此针对它们的答案似乎并没有准确地解决我打算知道的内容.
//PROG1
#include <stdio.h>
int main ()
{
FILE *fp=fopen("D:\\source.txt","r+");
char arr[20],brr[50];
fscanf(fp,"%s",arr);
printf("String is %s\n",arr);
//fseek(fp,0,SEEK_CUR); //Doesn't work without it
fprintf(fp," musket");
rewind(fp);
fgets(brr,50,fp);
printf("New string is %s",brr);
fclose(fp);
}
输出:
1)没有fseek()
-- 致命武器
2)有fseek()
—— 致命的火枪
//PROG2
#include <stdio.h>
int main ()
{
FILE *fp=fopen("D:\\source.txt","r+");
char arr[20],brr[50];
fgets(arr,20,fp);
printf("Initial line is %s\n",arr);
fprintf(fp," sale"); //writes to end of file
rewind(fp);
printf("New string is %s",fgets(brr,50,fp));
fclose(fp);
}
没有 fseek() 的输出: - Lethal weapon sale