也许这是一个非常简单的问题,但我很困惑
如果我的代码名为example.c并将txt文件作为输入,请说txt.txt
。我在终端(linux)中运行命令./example txt.txt
。
根据用户通过文件给我的内容,我创建了一个2D数组。
如果fie的背景是:
+X..XX....-
.X..X..X-..
.X.........
...XX......
XXX.+X.....
..X.....XXX
...XXX..X-.
.-.....X...
我计算行(在此示例中为1)和新行之前的元素,以查找我的数组的行。
请告诉我在将文件打印成二维数组时我做错了什么?
我无法正确打印数组。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){
int lines=0, rows=0, j, k;
char ch, array[1000][1000];
FILE *fin;
if(argc!=2){
exit(2);
}
fin=fopen(argv[1],"r");
if(fin==NULL) {
exit(2);
}
while(!feof(fin)){
ch=fgetc(fin);
if(ch=='\n') lines++;
}
fclose(fin);
fin=fopen(argv[1],"r");
while(!feof(fin)){
ch=fgetc(fin);
if(ch=='+' ||ch=='-'|| ch=='.'||ch=='X') rows++;
if(ch=='\n') break;
}
printf("%d %d\n", lines, rows);
fclose(fin);
fin=fopen(argv[1],"r");
while(!feof(fin)) {
for(j=0; j<lines; j++){
for(k=0; k<rows; k++){
scanf(fin, "%c", &array[j][k]);
}
}
//printf("%d %d", lines, rows);
int i;
for(i=0; i<lines; i++){
for(j=0; j<rows; j++){
printf("%c", array[i][j]);
//printf("%d %d\n", i, j);
}
}
fclose(fin);
return 0;
}
}
答案 0 :(得分:3)
您的代码中有几个问题
请参阅why while(foef(file))
is always wrong。如果你要读
按字符划分的文件字符,最好这样做:
int c;
while((c = getchar()) != EOF)
{
// do somthing with c
}
读取像fscanf(fin, "%c", &array[j][k]);
这样的值可以,但是
它有一个问题:你忘记考虑换行了。你是
只读row
个字符数,但整行(假设有
没有空格和制表符)有row+1
个字符,换行符不会消失,所以
当你读完一行的最后一个值时,下一个scanf
将会
不读取下一个值,它会读取换行符。你可以通过这样做来解决它
这样:
for(j=0; j<lines; j++){
for(k=0; k<rows; k++){
fscanf(fin, "%c", &array[j][k]);
getchar(); // consume the newline
}
通常,您应该使用fgets
逐行读取值,然后使用
可以使用sscanf
来解析该行。
所以,确定行数:
int lines = 0;
int c, last = '\n';
while((c = fgetc(fin)) != EOF)
{
last = c;
if(c == '\n')
lines++;
}
// in case the last line does not end with \n
// some file editors don't end the last line with \n
if(last != '\n')
lines++;
获取行数:
int rows = 0;
while((c = fgetc(fin)) != EOF)
{
// based on your example, the file does not
// contains other characters than +,-,.,X and newlines
if(ch == '\n')
break;
else
rows++;
}
现在要读取值:
// assuming that the file has the correct format and that
// all lines have the same length
char line[rows+2]; // +2 because of the newline and the 0 terminating byte
for(int i = 0; i < lines && i < 1000; ++i)
{
fgets(line, sizeof line, fin);
char *tmp = line;
for(int j = 0; j < rows && j < 1000; ++j)
sscanf(tmp++, "%c", &array[i][j]);
}
请注意,此代码表示文件格式正确且所有行都有
相同的长度。为了使阅读更加健壮(这意味着它
你可以对格式错误做出反应)你需要检查fgets
的返回值
sscanf
。我为了简单起见省略了这一点,但你应该添加这些
检查。
每次都不需要打开和关闭fin
,您可以使用rewind(fin)
在开头设置文件。