#include <stdio.h>
#define IN 1
#define OUT 0
int main()
{
while (1)
{
FILE *fptr1;
char filename[100];
printf("Enter the filename to open for reading \n");
scanf("%s", filename);
fptr1 = fopen(filename, "r");
int c, nl, nw, nc, state; // These variables aren't being reset.
while ((c = fgetc(fptr1)) != EOF)
{
++nc;
if (c == '\n') ++nl;
if (c == '\t' || c == '\n' || c == ' ') state = OUT;
else if (state == OUT)
{
state = IN;
++nw;
}
};
printf("Lines: %d Words: %d Characters: %d\n", nl, nw, nc);
}
return 0;
}
这是一个简单的程序,用于解析文件并输出它有多少行,单词和字符。当检测到新的行,单词和字符时,nl,nw,nc递增。输出:
输入要打开的文件名以供阅读
data.txt中
行:6个字:15个字符:81
输入要打开的文件名以供阅读
data.txt
行数:12个字:30个字符:162
输入要打开的文件名以供阅读
它第一次正常工作,但是当while循环结束并且只是不断添加它们时它不会破坏nl,nw,nc。为什么呢?
答案 0 :(得分:1)
你是&#34; 幸运&#34;它曾经工作过,你必须将它们全部初始化
1 XBT = 185,416,429.63 VND
1 VND = 0.00000000539327 XBT
也许是在宣布之后。重要的是它们必须在内部nl = nw = nc = state = 0;
循环之前初始化。
答案 1 :(得分:1)
您正在通过访问未初始化的变量来调用未定义的行为。
在每次迭代中,他们会获得一组新的变量。这意味着您不能依赖前一次迭代中的变量值。
ReferenceError: InfiniteScroll is not defined
很少有其他笔记将int c, nl = 0, nw = 0, nc = 0, state = OUT;
更改为scanf
。
完成使用后,也请关闭文件。否则,如果您在不关闭文件的情况下使用太多文件,则可能会耗尽资源。
scanf("%99s",filename);
在这种情况下,即使您不关闭它,它也会在退出流程时关闭,但仍然是释放您使用的资源的好习惯。这是良好做法。
答案 2 :(得分:0)
这些变量未被重置。
在while
循环的每次迭代中,您需要在使用它们之前手动重置它们,如下所示:
c = 0;
nl = 0;
nw = 0;
nc = 0;
state = OUT;
此外,请确保在每次循环迭代中关闭要打开的文件 -
fclose(fptr1);
答案 3 :(得分:0)
代码有效,因为你很幸运它没有崩溃。您从未初始化其值,因此在每个循环中,它们的值将重置为 indeterminate 。幸运的是,它们只是最后一个循环的值,但无人保证。
还有潜在的泄漏,您从未使用fclose(fptr1)
关闭文件句柄。在几个循环中,您可能会开始收到损坏的文件或无法打开更多文件。
答案 4 :(得分:0)
这段代码中有几个问题。
首先,您的所有计数器都没有初始值。在内部循环开始之前,nl, nw, nc, and state
可以有任意随机值。它们在堆栈上分配,“c”语言不会为您初始化它们。你真的很幸运,它第一次工作。因此,您需要将它们初始化为“0”,如其他答案所示。
但你也有更多的问题。首先,您的scanf
不会检查输入的大小。您假设文件名的长度不能超过100,但实际上并不一定如此。因此,您需要使用%99s
或类似内容来确保数组没有溢出。
其次,您在第一个lop的开头打开文件并且从不关闭它,您需要在循环结束时执行它以释放资源,否则您可能会耗尽所有系统资源用于打开的文件。