我有一个大小为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
最后一行没有完全奏效。我尝试增加行的数组维度,这会使最后一行显示,但会向我的输出添加垃圾值。任何帮助将不胜感激。
答案 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
字符是否已被读取也是安全的。