我试图从文本文件中填充数组。我使用fgetc,我的问题是处理文本文件中的换行符。我目前有,
for(i = 0; i < rows; i++){
for(j = 0; j < columns; j++){
if((fgetc(fp) == '\n') || (fgetc(fp) == '\r')){
fgetc(fp);
array[i][j] = fgetc(fp);
else{
array[i][j] = fgetc(fp);
}
printf("i %d j %d char %c code %d\n", i, j, array[i][j], array[i][j]);
}
}
这个想法是,如果有一个换行符,我想在循环的同一个i,j位置推进文件指针,这样我就可以得到下一个字符。这样的输出在前两行是混乱的,然后它开始阅读字符代码为-1的字符。我做错了什么吗?
4条答案
按热度按时间zf9nrax11#
每次调用fgec都会使文件指针前进。尝试调用一次:
int c = fgetc(fp);
然后测试c的值。如果需要,可以存储它,或者再次执行循环。
iih3973s2#
在你的第一个
if()
语句中,有一点问题。当你这样做时:实际上,我们调用了
fgetc(fp)
四次,其中两次是在if()语句中,两次是在后面,也许我们更多地是在寻找类似下面这样的语句:在本例中,每次迭代都只调用一次
fgetc(fp)
,如果它不是\n或\r,则将其放入数组中。对不起,我对
fgetc()
没有什么经验。如果你发现我做的事情非常糟糕,请通知我!cyvaqqii3#
我可以立即看到一个错误来源。在下面一行中:
有2个对fgetc的调用()。这意味着如果第一次调用没有返回'\n',则将进行另一次调用,然后将其返回值与'\r'进行比较。这会使文件指针前进两次,因为每次调用fgec时指针都会前进。更好的方法是获取一个字符,然后测试它是'\n'还是'\r',如果为true,则通过另一次调用fgec来递增文件指针。例如:
试试这个,看看是否仍然得到相同的错误。
gcxthw6b4#
我相信你在你的求值语句中得到了两次字符。另外,通常CRLF(回车和换行)行尾字符可以是两个字符。阅读http://en.wikipedia.org/wiki/Newline了解详细信息。
这是一个快速击中的代码从内存。我没有一个编译器现成的,但我认为这是正确的。