繁体   English   中英

除非我使用fseek(fp,0,SEEK_CUR),为什么在rb +模式下R / W转换中间文件失败?为什么它在文件末尾有用?

[英]Why R/W transition mid-file in rb+ mode fails unless I use fseek(fp,0,SEEK_CUR)?Why it works at end of file?

我从来没有意识到this.I本来很好下意识地假设为铁一般的事实,我可以阅读和写作之间的现有文件打开它更新模式过渡,就像在SO that.But两个问题( 12 )开车带我持怀疑态度,我决定尝试一下。这就是我发现的:

在第一个程序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

实际上,它看起来像你的libc实现中的一个错误。 文件I / O流通常是由OS内核实现的基于文件描述符的二进制I / O的libc抽象。 所以任何奇怪的行为都应该归因于你特定的libc怪癖。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM