【问题标题】:fprintf is not printing to the filefprintf 没有打印到文件
【发布时间】:2013-08-11 08:33:10
【问题描述】:

在以下代码中,fprintf 没有打印到文件并且 printf 显示错误的输出:

#include<stdio.h>

 void main()
{  
    FILE *fp;  
    int d,w,t;
    fp = fopen("file.txt","r+");//already created file having value 10
    fscanf(fp,"%d",&d); 
    printf("%d",d);//print value 10
    t=ftell(fp);
    fseek(fp,t,SEEK_END);
    fprintf(fp,"%d",1000); // printing 1000 to the file
    fscanf(fp,"%d",&w);
    printf("%d",w); // this printf is still printing wrong value 12803
    fclose(fp);
    getch();
}

【问题讨论】:

  • 我认为你需要将 d 和 w 初始化为 0
  • 打开编译器的警告。另外检查所有系统调用的返回值
  • @Mat: 以及库函数的返回值。
  • 写完之后是不是希望读取1000的值?写入后需要使用ftellfseek进行备份,因为写入也会移动文件指针。
  • 不要告诉我们它是“显示错误的输出”而不向我们显示输出。而void main() 是错误的;使用int main(void)

标签: c file-io printf


【解决方案1】:
#include<stdio.h>

 void main()

这是错误的;它应该是int main(void)。如果你有一本书 告诉你用void main(),它的作者不太懂C; 买一本更好的书。

{
    FILE *fp;
    int d,w,t;
    fp = fopen("file.txt","r+");//already created file having value 10

您需要检查fopen 调用是否成功,并且 如果程序失败,可能会终止程序。

    fscanf(fp,"%d",&d);
    printf("%d",d);//print value 10

假设到目前为止一切顺利,这将打印10 没有换行符。 如果您的程序有效,它的输出将是101000。将“%d”更改为“%d\n”。

    t=ftell(fp);

t 是文件中的当前位置,应该就在后面 10,所以从头开始有 2 个字节。

    fseek(fp,t,SEEK_END);

现在你将文件指针重新定位到 2 个字节 在结束之前 文件。这没有任何意义。你最终在哪里成为亲戚 到“10”取决于file.txt 中的其他内容(换行符?CR-LF?)

您可以保存ftell() 返回的值,稍后在 调用fseek,但只有在第三个参数是 SEEK_SET。所以你可能想要:

t = ftell(fp);
fseek(fp, t, SEEK_SET);

这不会改变你在文件中的位置,但它确实允许你 从您一直在写入的文件中读取。

哦,ftellfseek 使用 long 值,而不是 int。 如果文件不是,您的程序(带有这些修复程序)可能会工作 太大了,但你真的应该将t 声明为long 变量。

我还建议使用dwt 之类的名称会使您的代码更难阅读。使用更长的描述性名称。想想你以外的其他人试图阅读和理解你的代码——或者你在一个月后阅读自己的代码,那时你已经忘记了d 是什么。

通过这些更改,您在file.txt should now be just after the10`中的当前位置。

    fprintf(fp,"%d",1000); // printing 1000 to the file

现在您在10 之后立即打印1000,所以现在是文件 包含101000,并且您当前的位置是最后一个 你写的角色。

    fscanf(fp,"%d",&w);

在这里,您尝试在写入文件后立即从文件中读取。 但是你在文件的末尾,所以没有什么可读的。 由于您没有检查fscanf 的结果(它会告诉您 它失败了),w 没有改变,

    printf("%d",w); // this printf is still printing wrong value 12803

同样,添加换行符会使输出更易于阅读。

    fclose(fp);
    getch();

getch() 是一个特定于 Windows(和特定于 MSDOS)的函数, 在终止程序之前等待用户输入。如果你坚持 在使用它时,如果我没记错的话,你需要#include &lt;windows.h&gt;。 如果它没有抱怨,你应该调高编译器的警告级别 关于 getch 的缺失声明。

}

总结:

如果你想读写同一个打开的文件,你可以这样做 -- 但是需要调用一些定位函数比如fseek 在读和写之间,或者在写和读之间。

您应该检查所有库调用返回的值。为了 例如,如果file.txt 不存在,您的程序会悄悄地忽略 错误并继续尝试读取和写入文件,使用 未定义的结果。 (通常会忽略 printf 的结果 打电话,因为如果按标准打印,您无能为力 输出失败,但无论如何查看结果是有启发性的。)

编写您的 printf 调用,以便输出可读。打印换行符 (\n) 在每个输出行的末尾。

阅读您使用的每个函数的文档。

请你的编译器警告你有问题的结构。查看您的 编译器的文档以了解如何执行此操作。

【讨论】:

    【解决方案2】:

    您需要在同一文件中的读取和写入之间执行fseek()(或类似的)。这不是所有实现中的严格要求,但它是可移植性所必需的。


    编辑

    好的,你的新版本有:

    t=ftell(fp);
    fseek(fp,t,SEEK_END);
    

    这在某些情况下可能有意义,但可能不是这个。一世 认为你的意思是:

    fseek(fp, 0, SEEK_CUR);
    

    相对于当前位置寻找,而不实际移动 任何地方。

    但是您没有收到w==1000 的原因是在这两行之间:

    fprintf(fp,"%d",1000); // printing 1000 to the file
    fscanf(fp,"%d",&w);
    

    您无需在此处搜索即可从写作过渡到阅读。你不能 完全确定您将尝试阅读文件中的哪个位置w 从不使用 seek 重新断言你想要的位置。

    试试:

    t = ftell(fp);
    fprintf(fp,"%d",1000); // printing 1000 to the file
    fseek(fp, t, SEEK_SET);
    fscanf(fp,"%d",&w);
    

    顺便说一句,这段代码还有很多其他危险;像 fprintf 不打印任何终止字符,所以有 可能在您写入的位置之后出现尾随数字(来自上一个 写入附加到该值的其他值或其他值 读入w

    【讨论】:

    • 我使用 fseek() 但 printf() 语句仍在打印值 12803
    猜你喜欢
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多