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

Ansi C: Attempting to count total chars in a file

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

这意味着我的循环:

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

没有运行。

在我的测试中,我发现循环从不 运行,因为 "Loop ran" 从不打印。我是 c 的新手,不确定在尝试计算文件中的字符数时是否做错了什么。

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

我在图书馆工作,所以如果需要 posted 或需要澄清任何内容,我会尽量快速回复。我不想 post 我的整个代码,因为会有作弊的机会,我需要自己完成。

先谢谢了。

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

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

或者你可以只调用 ftell 来找出你在文件中的偏移量,如果你截断、写入而不倒带,它与写入的字节数相同。

您正在使用 w+ 模式打开,这将截断文件。来自 fopen 手册页:

w+ Open for reading and writing. The file is created if it does not exist, otherwise it is truncated. The stream is positioned at the beginning of the file.

如果您正在从文件中读取并且仍想写入文件,则您需要使用 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);
}