【发布时间】:2013-12-08 19:23:32
【问题描述】:
问题在这里解决: fgetc not starting at beginning of large txt file
我在 c 中工作,而 fgetc 没有从文件开头获取字符。它似乎是在\n 之后的文件中随机开始的。该函数的目标是修改数组 productsPrinted。如果遇到“需要更多数据”或“隐藏未列出”,则数组中的位置 productsPrinted[newLineCount] 将更改为 0。感谢任何帮助。
更新:它适用于较小的文件,但不能从较大的 617kb 文件的开头开始。
函数调用到类别:
findNoPics(image, productsPrinted);
findVisible(visible, productsPrinted);
removeCategories(category, productsPrinted);
来自 fgetc() 的示例输入:
Category\n
Diagnostic & Testing /Scan Tools\n
Diagnostic & Testing /Scan Tools\n
Hidden non listed\n
Diagnostic & Testing /Scan Tools\n
Diagnostic & Testing /Scan Tools\n
Hand Tools/Open Stock\n
Hand Tools/Sockets and Drive Sets\n
More Data Needed\n
Hand Tools/Open Stock\n
Hand Tools/Open Stock\n
Hand Tools/Open Stock\n
Shop Supplies & Equip/Tool Storage\n
Hidden non listed\n
Shop Supplies & Equip/Heaters\n
代码:
void removeCategories(FILE *category, int *prodPrinted){
char more[17] = { '\0' }, hidden[18] = { '\0' };
int newLineCount = 0, i, ch = 'a', fix = 0;
while ((ch = fgetc(category)) != EOF){ //if fgetc is outside while, it works//
more[15] = hidden[16] = ch;
printf("%c", ch);
/*shift char in each list <- one*/
for (i = 0; i < 17; i++){
if (i < 17){
hidden[i] = hidden[i + 1];
}
if (i < 16){
more[i] = more[i + 1];
}
}
if (strcmp(more, "More Data Needed") == 0 || strcmp(hidden, "Hidden non listed") == 0){
prodPrinted[newLineCount] = 0;
/*printf("%c", more[0]);*/
}
if (ch == '\n'){
newLineCount++;
}
}
}
【问题讨论】:
-
fseek到文件开头(我猜你在其他地方使用这个FILE *或者多次调用这个函数 -
这与
fgetc()not working — returns same char repeatedly 密切相关。针对该问题确定的特定缺陷已得到修复(如果您接受答案会很好 - 它让人们知道您感谢他们的帮助)。循环已经改变了;缩进仍然不稳定。结构相似——但意图仍然不明确。 -
(a) 这个程序/函数试图做什么; (b) 调用代码是什么样的?您应该查看阅读 EOF 时发生的情况(您当然会在数据发生后处理数据,就好像它没有发生一样)。拥有几 (2-5) 行输入数据以及这些输入行的预期输出将大有帮助。
-
你不能正确地终止你的字符串。读取/赋值行
more[15] = hidden[16] = ch = fgetc(category);覆盖more和hidden末尾的空值,使您的字符串没有空终止符,因此当您最终将字符移动到开头时strcmp()操作失败字符串。