将文本文件读入C中的2D数组

时间:2017-02-15 15:38:34

标签: c arrays file parsing

我有一个大小为8乘12(8行,12列)(x,y)的文本文件

abcdefghjikl
123456789abc
aerereghjikl
123456789abc
abc43434dfdf
12erere789ab
abcdefghjikl
12345fdfd89a

我试图将每个单独的字符读入2d数组,其中第一个维度是行,第二个维度是列。

这是我尝试过的:

int main(void) {
    FILE * fp;
    fp = fopen("test.txt","r");

    char points[8][12];
    int i,j;

    for(i=0; i<8; i++) {
        for(j=0; j<12; j++) {
            fscanf(fp,"%c",&points[i][j]);
        }
    }

    for(i=0; i<8; i++) {
        for(j=0; j<12; j++) {
            printf("%c",points[i][j]);
        }
    }

    return 0;
}

但是我的输出似乎正常工作,直到文件的最后一行。

abcdefghjikl
123456789abc
aerereghjikl
123456789abc
abc43434dfdf
12erere789ab
abcdefghjikl
12345

最后一行没有完全奏效。我尝试增加行的数组维度,这会使最后一行显示,但会向我的输出添加垃圾值。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:5)

顾名思义,换行符也是字符。你应该发现你的输出保留换行符是可疑的。

文件的每一行实际上有13个字符(假设是unix系统)。十二个可打印的,换行。

因此,对于i = 1 ... 7,每个“行”中的第一个字符是换行符。

幸运的是,可以指示scanf在等待字符输入时跳过空格字符。只需在格式说明符字符串的开头添加一个空格:

fscanf(fp, " %c", &points[i][j]);

答案 1 :(得分:3)

注意:您缺少7个字符,这是您的数组中放置的MainWindow::MainWindow( QWidget *parent ) : ... initialization list ... { ui->setupUi( this ); console->setPlainText("text"); .. other stuff ... } 的数量。

\n

每行末尾都有一个abcdefghjikl \n 123456789abc \n aerereghjikl \n 123456789abc \n abc43434dfdf \n 12erere789ab \n abcdefghjikl \n 12345 。哪个不可见,但存储在数组中。

您可以通过告诉文件指针位置跳过1个字符来跳过此步骤。

\n

输出:

for(i=0; i<8; i++) {
    for(j=0; j<12; j++) {
        fscanf(fp,"%c",&points[i][j]);
    }
    fseek( fp, 1, SEEK_CUR );
}

答案 2 :(得分:0)

您应检查fp的返回指针,以确保文件已正确打开。这样的事情就是你需要做的事情:

FILE * fp;
fp = fopen("test.txt","r");
if (fp == NULL) {
    /* handle exit */

至于有关文件最后一行的错误,您需要更改此段:

for(i=0; i<8; i++) {
    for(j=0; j<12; j++) {
        fscanf(fp,"%c",&points[i][j]);
    }
}

要:

for(i=0; i<8; i++) {
    for(j=0; j<12; j++) {
        if (fscanf(fp,"%c ",&points[i][j]) != 1) {
            fprintf(stderr, "Non character found.\n");
            return 1;
        }
    }
    printf("\n");
}

fscanf()中跳过任意数量的尾随空格。 fscanf()将在输入缓冲区中留下换行符,并在下一次fscanf()调用时继续使用。检查1字符是否已被读取也是安全的。