#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 the
10`。
fprintf(fp,"%d",1000); // printing 1000 to the file
1000
现在您在 之后立即打印10
,所以现在文件包含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
在每个输出行的末尾打印换行符 ( )。
阅读您使用的每个功能的文档。
让你的编译器警告你有问题的结构。请参阅编译器的文档以了解如何执行此操作。