在C中将文本文件阅读到2D数组中

cczfrluj  于 2023-10-16  发布在  其他
关注(0)|答案(4)|浏览(96)

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

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

我尝试将每个字符读入一个二维数组,其中第一维是行,第二维是列。
这是我尝试过的:

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

最后一条线不能完全工作。我尝试增加行的数组维度,这会使最后一行出现,但会向输出中添加垃圾值。如果你能帮忙的话,我将不胜感激。

wn9m85ua

wn9m85ua1#

换行符,顾名思义,也是字符.您应该已经发现输出中保留了换行符这一点很可疑。
实际上,文件的每一行有13个字符(假设是unix系统)。十二个可打印的,和一个新行。
因此,对于i = 1...7,每一行的第一个字符都是换行符。
幸运的是,scanf可以在等待字符输入时跳过空白字符。只需在格式说明符字符串的开头添加一个空格:

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

uidvcgyl2#

**注意:**您缺少7个字符,这是放入数组中的\n的数量。

abcdefghjikl \n
123456789abc \n
aerereghjikl \n
123456789abc \n
abc43434dfdf \n 
12erere789ab \n 
abcdefghjikl \n
12345

在每一行的末尾都有一个\n。它对您不可见,但存储在数组中。
你可以简单地跳过这个,告诉文件指针位置跳过1个字符。

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

输出量:

abcdefghjikl
123456789ab
aerereghjik
123456789ab
abc43434dfd
12erere789a
abcdefghjik
12345fdfd89
whhtz7ly

whhtz7ly3#

您应该检查返回指针是否为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字符是否被读取也是安全的。

nwlqm0z1

nwlqm0z14#

把你的数据放到txt文件中,就像这样(没有\n):
abcdefghjikl123456789abcaereghjikl123456789abcabc43434df12erere789ababcdefghjikl12345fdf89a
看看魔术。

相关问题