Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么fseek和fputc在我的程序中不起作用?_C - Fatal编程技术网

为什么fseek和fputc在我的程序中不起作用?

为什么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

我正在学习用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;
        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来读取字节