我从未意识到这一点。我可能会下意识地认为,在打开更新模式的现有文件上,我可以自如地在阅读和写作之间进行转换。但是,两个关于此问题的SO问题(1,2)让我产生了怀疑,于是我决定尝试一下。以下是我的发现:
在第一个程序prog1
中,我处理一个名为source.txt
的文件,该文件只有一行Lethal weapon。我使用fscanf()
读取第一个单词Lethal,并打算在其后面写入" musket",期望得到Lethal musket。但它失败了,我最终仍然得到原始内容Lethal weapon。但是,在那个第一个程序中,如果我插入fseek(fp,0,SEEK_CUR)
这一行,写操作就能正常工作,我会得到Lethal musket。我注意到fseek(fp,0,SEEK_CUR)
除了纯粹调用fseek()
之外没有任何作用,因为根本没有实际的寻找。
但是在第二个程序prog2
中,同样的情况不需要fseek(fp,0,SEEK_CUR)
语句。确切地说,在第二个程序中,与第一个程序读取文件中间相反,我在读到文件结尾后开始写入。即使没有使用fseek(fp,0,SEEK_CUR)
,这里的写入也是成功的,并且我得到了所需的内容Lethal weapon sale。
问题:为什么我们不能在文件中间从read
模式转换为write
模式,并且fseek(fp,0,SEEK_CUR)
有何区别可以让它正常工作?同时,为什么如果我们读取到文件结尾并在那里写入,相同的转换就可以顺利完成,而不需要使用fseek(fp,0,SEEK_CUR)
?在第一个程序中,使用fseek(fp,0,SEEK_CUR)
使写入成功是否明智?是否有更好的替代方法?
有两个stackoverflow问题在某种程度上解决了同一个问题,但由于它们更多地基于寻求文本/书籍摘录的解释,答案偏向于它们似乎没有精确回答我想要知道的内容。
//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() 的输出: -- 致命武器销售
fread
,写入时使用fwrite
。我尝试了你的代码,但行为不同。 - MYMNeofseek()
仍然是 致命武器,这似乎与其他两个问题及其链接所说的相符。 - Rüppell's Vulture