我必须编写一个程序,在for循环中读取多个文件,并计算该文件的单词,句子和音节。函数 CountWords 中的代码如下所示:(文件名是一个二维数组,其中包含17个文件的名称)
for (i = 0; i < 17; ++i) {
inputfile = fopen(filenames[i], "r");
if (inputfile == NULL) {
printf("File cannot be found, verify %s is in the correct location.\n", filenames[i]);
}
int c;
while (c != EOF) {
c = getc(inputfile);
//code to count words/syllables/sentences
}
fclose(inputfile);
虽然它成功地计算了第0个元素中的文件,但其余部分则为零字,零句,零音节。有什么我做错了吗?谢谢你的见解
答案 0 :(得分:1)
我在这里向您展示的代码中可以看到两个问题:
首先,循环文件名的方式是危险的,因为您很可能会遇到未初始化的2D数组的一部分。首选filenames[i] != NULL
作为停止条件,并确保数组已正确初始化:
for (i = 0; filenames[i] != NULL; ++i) {
CountWords(filenames[i]);
}
其次,这是最重要的一点,您没有检查系统调用fopen
。这意味着,您的fscanf
很可能正在从NULL指针读取(如果打开失败,则为fopen
returns。)
如果您的循环出现问题,请尝试使用printf
检查索引,fd或其他可能导致问题的内容;这是一个很好的做法,在将来的调试中对你有用;)
答案 1 :(得分:1)
你可能会尝试使用'getc'而不是fscanf来读取单个字符(如果你没有读过UTF-8?)但是在这种情况下我认为这不是问题。
如果当前代码在2个文件后停止,可能该文件不存在或不可读,在这种情况下我相信fopen将返回null并在errno中设置错误值。 你的代码(除非你为帖子简化了它)不会检查fopen的失败结果,所以它可能会在那时因为段错而崩溃。
要了解发生了什么,我建议检查所有文件名是否存在且可读, 并在代码中添加对pInputFile
值的检查自从我使用C以来已经有很长一段时间但是这样的事情:
#include <errno.h>
pInputFile = fopen(inputFile,"r');
if(!pInputFile)
{
fprintf(STDERR, "Failed opening %s [error %d]",inputFile,errno());
return -1;
}
然后在你的循环中,检查返回值&lt; 0 例如:
int count=0;
for (i = 0; i < 18; ++i) {
count = CountWords(filenames[i]);
if(count < 0)
{
//discard the result
}
else
{
// do something with the result
}
}
祝你好运
正如Hurlu指出的那样,你已经将循环中的文件数量硬编码为18,这可能与数组的大小不匹配。 C中通常的惯例是将函数传递给函数中的多个项目,并在for循环中使用它而不是固定数字'18'
此外,如果您的文件名数组正由其他一些函数填充, 它可能会将无效的名称或空值放入数组中。