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);
}
任务很简单,但我对返回 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);
}