gpt4 book ai didi

c - 除非我使用 fseek(fp,0,SEEK_CUR),否则为什么 rb+ 模式下的 R/W 过渡文件中间失败?为什么它在文件末尾工作?

转载 作者:行者123 更新时间:2023-12-04 08:08:08 27 4
gpt4 key购买 nike

我从来没有意识到这一点。我本可以下意识地假设一个硬事实,即我可以在现有文件上的读写之间转换,打开它更新模式,就像那样。但是关于 SO 的两个问题(1 , 2 ) 让我怀疑,我决定尝试一下。这是我的发现:

在第一个程序 prog1 中,我处理一个文件 source.txt,它只有 Lethal weapon 这行。我读了第一世界 Lethal 使用 fscanf() 并打算在之后立即编写 "musket" 期望得到 Lethal musket .But it simply failed, and I still get the original content Lethal weapon at the end of the write operation.But in that first program, if I insert the line 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) 使第一个程序中的写入成功有多明智?有更好的选择吗?

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() -- Lethal musket

//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() 的输出: -- 致命武器销售

最佳答案

实际上,它看起来像是您的 libc 实现中的错误。文件 I/O 流通常是对操作系统内核实现的基于文件描述符的二进制 I/O 的 libc 抽象。因此,任何奇怪的行为都应归因于您特定的 libc 怪癖。

由于您显然使用的是 Windows,这可能是问题的根源。您使用的编译器是什么?GCC 4.6.1 和 glibc-2.13 在 Ubuntu 11.10 上没有这个问题。

关于c - 除非我使用 fseek(fp,0,SEEK_CUR),否则为什么 rb+ 模式下的 R/W 过渡文件中间失败?为什么它在文件末尾工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16728240/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com