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

问题描述 投票:1回答:4

任务很简单,但我遇到的问题是返回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个字符串长度的字符串,我使用我刚刚发布的方法计算将使用的字符总数导航我的显示数据方法。

我正在图书馆工作,所以如果需要额外发布或者需要澄清任何事情,我会尽快回复我的回复。我不想发布我的整个代码,因为有机会作弊,我需要自己完成这个。

谢谢你。

c arrays file-io
4个回答
0
投票

为什么你必须逐个读取所有字节来计算它们? fseek( fp, 0, 2 )跳转到文件末尾并使用ftell( fp )获取当前位置(文件长度)要容易得多。


2
投票

如果您写入文件然后在同一文件句柄上调用您的方法,文件句柄已经在文件的末尾,因此它将立即看到EOF。我们需要看到更多的代码,以确保我的想法。

因此,您可以在函数开头重绕文件句柄。

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


0
投票

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

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

如果您正在从文件中读取并仍想写入它,则需要使用rb+而不是wb+打开它。如果您已经写入并希望阅读所写的内容,则需要寻找文件指针的开头。

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

0
投票

如果文件未打开,您可以使用:

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.