Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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
Ansi C:尝试计算文件中的总字符数_C_Arrays_File Io - Fatal编程技术网

Ansi C:尝试计算文件中的总字符数

Ansi C:尝试计算文件中的总字符数,c,arrays,file-io,C,Arrays,File Io,任务很简单,但我对返回0的方法有问题 这意味着我的循环: int getCharCount(FILE *fp) { int c; int i = 0; while( (c = fgetc(fp)) != EOF) { i++; printf("Loop ran"); } return i; } 他没有跑 在我的测试中,我发现循环从未运行,因为“循环运行”从未打印。我是c语言的新手,不确定我在计算文件中的字符时是否做错了什

任务很简单,但我对返回0的方法有问题

这意味着我的循环:

int getCharCount(FILE *fp) {
    int c;
    int i = 0;
    while( (c = fgetc(fp)) != EOF)  {
        i++;
        printf("Loop ran");
    }
    return i;
}
他没有跑

在我的测试中,我发现循环从未运行,因为“循环运行”从未打印。我是c语言的新手,不确定我在计算文件中的字符时是否做错了什么

我觉得我应该提到文件是用“wb+”模式打开的,并且有一些长的方法可以编辑文件。基本上,在使用这个getCharCount()方法之前,文本文件将清除所有以前的数据,然后用户一次输入44个字符长度的字符串,我使用我刚刚发布的这个方法来计算用于导航显示数据方法的字符总数

我在图书馆里做这件事,所以如果有什么额外的东西需要发布或者需要澄清的话,我会尽快回复。我不想发布我的全部代码,因为有可能作弊,我需要自己完成


非常感谢。

如果写入文件,然后在同一文件句柄上调用方法,则文件句柄已经位于文件末尾,因此它将立即看到EOF。我认为,我们需要看到更多的代码才能确定

因此,可以在函数开始时倒带文件句柄


或者,您可以直接调用ftell查找文件中的偏移量,这与截断、写入和不倒带时写入的字节数相同。

您正在以将截断文件的模式打开。从fopen手册页:

w+开放阅读和写作。如果文件不存在,则创建该文件,否则将截断该文件。流位于文件的开头

如果您正在从文件中读取内容,但仍要写入,则需要使用
rb+
而不是
wb+
打开该文件。如果您已经对其进行了写入,并且希望读取所写入的内容,则需要查找文件指针的开头

// Both of these seek to the start
rewind(fp);
fseek(fp, 0, SEEK_SET);

为什么要一个接一个地读取所有字节来计数?执行
fseek(fp,0,2)
在文件末尾跳转并使用
ftell(fp)
获取当前位置(文件长度)要容易得多。如果文件未打开,您可以使用:

off_t getFileSize(const char *filepath) {
   struct stat fileStat;
   stat(filepath, &fileStat);
   return(fileStat.st_size);
}
如果文件已打开:

off_t getFileSize(int fd) {
   struct stat fileStat;
   fstat(fd, &fileStat);
   return(fileStat.st_size);
}

在您的
printf
调用之后添加一个
fflush(stdout)
,看看它是否改变了某些内容。您可能在编写之后没有找到开头。尝试了fflush(stdout);可悲的是,这没有帮助,我现在将尝试寻找。如何正确地将搜索指向文件的开头?顺便说一句,ANSI C非常古老(它是C89)。请至少将标准升级到C99(最好是C11)。如果你的编译器非常古老(上个世纪),你也需要升级它!我的教授希望我们使用C89:)在文本编辑器中对c进行编码。您应该指定
SEEK\u END
而不是
2
,以使正在执行的操作更清晰。是的,SEEK\u END是命名的定义。最后,SEEK使循环运行。我记得几周前教授谈论过这一点,但没有想到在这里应用它。谢谢。这是向文件添加数据的方法。当心,它是在凌晨4点写的。流程应该是这样的:./a(文件名)“ok”添加荷马·辛普森100“ok”添加玛姬·辛普森99“ok”显示2辛普森,玛姬:99;在用户发送null(crtl+d)之前,程序基本上是一个循环。如果文件作为参数传入,并且该文件已存在,则该文件将被覆盖。否则它将被创建。