为什么fseek和fputc在我的程序中不起作用?
我正在学习用C语言编程。请解释为什么我的程序不起作用。怎么了?该程序创建一个文件,将一个数字写入该文件,并在每次运行该程序时增加该数字。程序计算我打开文件的次数为什么fseek和fputc在我的程序中不起作用?,c,C,我正在学习用C语言编程。请解释为什么我的程序不起作用。怎么了?该程序创建一个文件,将一个数字写入该文件,并在每次运行该程序时增加该数字。程序计算我打开文件的次数 #include <stdio.h> int main (void) { int n; int c; FILE* f = fopen("count_pr.bin", "a+"); if ((c=fgetc(f)) == EOF) { n=1; fput
#include <stdio.h>
int main (void)
{
int n;
int c;
FILE* f = fopen("count_pr.bin", "a+");
if ((c=fgetc(f)) == EOF)
{
n=1;
fputc(n, f);
}
else
{
++n;
fseek(f, 0, SEEK_SET);
fputc(n, f);
}
printf ("The program was opened: %d\n", n);
fclose(f);
}
将值读入c。然后将未初始化变量n增加1,并将n写入文件。因为n未初始化,所以调用未定义的行为
您需要使用读取的值:
else
{
n = c + 1; // Changed line
fseek(f, 0, SEEK_SET);
fputc(n, f);
}
在a+模式下,从
追加/更新:打开一个文件以更新输入和输出,所有输出操作都在文件末尾写入数据。重新定位操作fseek、fsetpos、rewind会影响下一个输入操作,但输出操作会将位置移回文件末尾。如果文件不存在,则创建该文件
输出操作将位置移回文件末尾。因此,您所做的每一次写入操作都将位于文件的末尾
此外,您需要按照Klas的建议进行更改
如果每次都要覆盖数字,则应使用r+模式
读取/更新:打开文件以更新输入和输出。该文件必须存在
如果文件不存在,仍然存在创建文件的问题,因此在这种情况下,如果文件不能在r+模式下打开,那么您可以在w或w+模式下打开它,并且只对其进行写入
我已经更新了下面的代码
#include <stdio.h>
int main (void)
{
int n;
int c;
FILE* f = fopen("count_pr.bin", "r+");
if (f == NULL)
{
f = fopen("count_pr.bin", "w");
if (f != NULL)
{
n = 1;
fputc(n, f);
}
else
{
printf (" File Open Error");
exit(1);
}
}
else
{
c=fgetc(f);
n = c+1;
fseek(f, 0, SEEK_SET);
fputc(n, f);
}
printf ("The program was opened: %d\n", n);
fclose(f);
}
如果我使用w,那么每次运行程序时都会丢弃文件的内容,对吗?只有当r+返回NULL时才使用w。r+返回NULL的原因之一是文件不存在。所以我们检查一下这种情况。答案更新为code.int,16位编译器的最大值为32767,32位编译器的最大值为2147483647。这是一个问题。程序将在256次后显示1。在这种情况下,每次仅写入1字节2^8=256。此外,我需要使用unsigned long而不是int。问题在于fputc。这只处理单个字符。所以只写了一个字符。您可以将fprintf与%d一起使用来写入int。请注意,然后需要使用fscanf来读取字节