C语言 从文本文件填充数组

7z5jn7bk  于 2023-03-22  发布在  其他
关注(0)|答案(4)|浏览(125)

我试图从文本文件中填充数组。我使用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的字符。我做错了什么吗?

zf9nrax1

zf9nrax11#

每次调用fgec都会使文件指针前进。尝试调用一次:
int c = fgetc(fp);
然后测试c的值。如果需要,可以存储它,或者再次执行循环。

iih3973s

iih3973s2#

在你的第一个if()语句中,有一点问题。当你这样做时:

if((fgetc(fp) == '\n') || (fgetc(fp) == '\r')){
        fgetc(fp); 
        array[i][j] = fgetc(fp);

实际上,我们调用了fgetc(fp)四次,其中两次是在if()语句中,两次是在后面,也许我们更多地是在寻找类似下面这样的语句:

for(i = 0; i < rows; i++){
    for(j = 0; j < columns; j++){
        int test = fgetc(fp);
        if(test != '\n' && test != '\r')
            array[i][j] = test;
        //We want to "undo" the last j++ if we got a whitespace
        else
            j--;
        printf("i %d j %d char %c code %d\n", i, j, array[i][j], array[i][j]); 
     }
}

在本例中,每次迭代都只调用一次fgetc(fp),如果它不是\n或\r,则将其放入数组中。
对不起,我对fgetc()没有什么经验。如果你发现我做的事情非常糟糕,请通知我!

cyvaqqii

cyvaqqii3#

我可以立即看到一个错误来源。在下面一行中:

if((fgetc(fp) == '\n') || (fgetc(fp) == '\r'))

有2个对fgetc的调用()。这意味着如果第一次调用没有返回'\n',则将进行另一次调用,然后将其返回值与'\r'进行比较。这会使文件指针前进两次,因为每次调用fgec时指针都会前进。更好的方法是获取一个字符,然后测试它是'\n'还是'\r',如果为true,则通过另一次调用fgec来递增文件指针。例如:

char letter = fgetc(fp);
if((letter == '\n') || (letter == '\r')
...
...

试试这个,看看是否仍然得到相同的错误。

gcxthw6b

gcxthw6b4#

我相信你在你的求值语句中得到了两次字符。另外,通常CRLF(回车和换行)行尾字符可以是两个字符。阅读http://en.wikipedia.org/wiki/Newline了解详细信息。

#include <stdio.h>

int main ()
{
   FILE *fp;
   int c;

   fp = fopen("file.txt","r");
   if(fp == NULL) 
   {
      fprintf(stderr,"Error opening file");
      return(-1);
   }
   do
   {
      c = fgetc(fp);
      if ((c == '\n') || (c == '\r')) {
        fgetc(fp); // skip CR or LF and advance a character
      } else {
        printf("%c", c); // print all other characters
      }
   }while(c != EOF);

   fclose(fp);

   return(0);
}

这是一个快速击中的代码从内存。我没有一个编译器现成的,但我认为这是正确的。

相关问题