我有一个大小为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
最后一条线不能完全工作。我尝试增加行的数组维度,这会使最后一行出现,但会向输出中添加垃圾值。如果你能帮忙的话,我将不胜感激。
4条答案
按热度按时间wn9m85ua1#
换行符,顾名思义,也是字符.您应该已经发现输出中保留了换行符这一点很可疑。
实际上,文件的每一行有13个字符(假设是unix系统)。十二个可打印的,和一个新行。
因此,对于i = 1...7,每一行的第一个字符都是换行符。
幸运的是,
scanf
可以在等待字符输入时跳过空白字符。只需在格式说明符字符串的开头添加一个空格:uidvcgyl2#
**注意:**您缺少7个字符,这是放入数组中的
\n
的数量。在每一行的末尾都有一个
\n
。它对您不可见,但存储在数组中。你可以简单地跳过这个,告诉文件指针位置跳过1个字符。
输出量:
whhtz7ly3#
您应该检查返回指针是否为
fp
,以确保文件被正确打开。像这样的事情是你需要做的:至于你关于文件的最后一行的错误,你需要改变这段:
收件人:
它跳过
fscanf()
中任意数量的尾随白色空格。fscanf()
将在输入缓冲区中留下一个换行符,并在下一个fscanf()
调用中继续。检查1
字符是否被读取也是安全的。nwlqm0z14#
把你的数据放到txt文件中,就像这样(没有\n):
abcdefghjikl123456789abcaereghjikl123456789abcabc43434df12erere789ababcdefghjikl12345fdf89a
看看魔术。