所以我现在遇到了我的程序问题。我试图让它打开文件计数行倒带然后通过文件来存储变量。
String String String int
是文件的格式,但在计算行数后我遇到了问题。我可以将数字打印到屏幕上,然后在打印后立即出现seg故障。我不知道为什么
int countLines(FILE * fin){
int count=0;
char street[100];
char city[100];
char state[3];
int zip;
do{
fgets(street, 100, fin);
fgets(city, 100, fin);
fgets(state, 3, fin);
fscanf(fin, "%d\n", &zip);
count++;
}while(!feof(fin));
rewind(fin);
return count;
}
lines=countLines(fin);
是我调用函数的方式。我做错了什么?
答案 0 :(得分:2)
在非常使用这些功能之前,请勿将fgets()
与fscanf()
混合。他们在一起打得不好。格式中的\n
是一个空格,将匹配任意个连续空格,包括多个\n
,空格,制表符等。
// fscanf(fin, "%d\n", &zip);
建议避免feof()
并使用fgets()
的返回值。
feof()
之前, char
不会成立。这与“没有人离开时的真实”不同。示例:您阅读了文件的最后char
。 feof()
仍然是假的。代码尝试读取更多(和失败)。 现在 feof()
是真的。 (并且仍然是真的)。
以简单的方式计算线条并使用对称性。进一步考虑更多错误检查。将邮政编码行作为字符串阅读,然后将其解析为整数。
int countLines(FILE * fin){
int count=0;
char street[100];
char city[100];
char state[100];
char zips[100];
unsigned zip;
while (fgets(street, sizeof street, fin) != NULL) {
count++;
}
rewind(fin);
if (count%4 != 0) Handle_LineCountNotMultipleof4();
// You could return here, but let's read the file again and get the data.
// This is likely part of OP's next step.
for (int i=0; i<count; i += 4) {
if ((NULL == fgets(street, sizeof street, fin)) ||
(NULL == fgets(city, sizeof city, fin)) ||
(NULL == fgets(state, sizeof state, fin)) ||
(NULL == fgets(zips, sizeof zips, fin)) ||
(1 != sscanf(zips, "%u", &zip))) handle_error();
// Remember street, city, state, still have an ending \n
do_something(street, city, state, zip);
}
return count;
}
或者,要计算行数,请使用以下内容。如果你有很长的线条,那么阅读会出现一个奇怪的困难,所以我们一边检查一下。如果您更喜欢简单的答案,请将此line length
内容拿出来。您可以使用Maxline+1
作为缓冲区大小而不是固定的100。
size_t Maxline = 0;
size_t Curline = 0;
int ch;
while ((ch = fgetc(fin)) != EOF) {
Curline++;
if (ch == '\n') {
count++;
if (Curline > Maxline) MaxLine = Curline;
Curline = 0;
}
}
if ((Maxline + 1) > 100) TroubleAhead() ; // Trouble with future (fgets(buf, 100, fin), use bigger buffers
rewind(fin);
答案 1 :(得分:0)
fgets试图读取整行,而不只是一个单词,这似乎是你所希望的。 所以,你传递的缓冲区不够大,并且它们不会得到你的跳跃,并且你每3行增加一次计数,并且fscan通常不会读取一行,留下该行的遗骸干扰你的下一次阅读。
如果您想阅读单词,请使用%s尝试scanf。如果你想读取固定数量的字符,请尝试fread。