#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);
这不会改变你在文件中的位置,但它确实允许你
从您一直在写入的文件中读取。
哦,ftell 和 fseek 使用 long 值,而不是 int。
如果文件不是,您的程序(带有这些修复程序)可能会工作
太大了,但你真的应该将t 声明为long 变量。
我还建议使用d、w 和t 之类的名称会使您的代码更难阅读。使用更长的描述性名称。想想你以外的其他人试图阅读和理解你的代码——或者你在一个月后阅读自己的代码,那时你已经忘记了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 <windows.h>。
如果它没有抱怨,你应该调高编译器的警告级别
关于 getch 的缺失声明。
}
总结:
如果你想读写同一个打开的文件,你可以这样做
-- 但是需要调用一些定位函数比如fseek
在读和写之间,或者在写和读之间。
您应该检查所有库调用返回的值。为了
例如,如果file.txt 不存在,您的程序会悄悄地忽略
错误并继续尝试读取和写入文件,使用
未定义的结果。 (通常会忽略 printf 的结果
打电话,因为如果按标准打印,您无能为力
输出失败,但无论如何查看结果是有启发性的。)
编写您的 printf 调用,以便输出可读。打印换行符
(\n) 在每个输出行的末尾。
阅读您使用的每个函数的文档。
请你的编译器警告你有问题的结构。查看您的
编译器的文档以了解如何执行此操作。