不要读C语言文本的第一行

不要读C语言文本的第一行,c,file,matrix,scanf,C,File,Matrix,Scanf,我有这样一个文本文件: 330 2 3 5 389 4 5 6 我想把这些数字放到一个矩阵中。 第一行是为矩阵生成malloc的行数和列数。 接下来的几行是矩阵上的数字。 我有这个密码: int mat[3][3]; int i, j; FILE *fp; char c; if((fp = fopen("texto.txt", "r")) == NULL){ printf("Error al abrir el archivo"); return -1; } for(i=0;i

我有这样一个文本文件:

330

2 3 5

389

4 5 6

我想把这些数字放到一个矩阵中。 第一行是为矩阵生成malloc的行数和列数。 接下来的几行是矩阵上的数字。 我有这个密码:

int mat[3][3];
int i, j;
FILE *fp;
char c;

if((fp = fopen("texto.txt", "r")) == NULL){
    printf("Error al abrir el archivo");
    return -1;
}

for(i=0;i<3;i++){
    for(j=0;j<3;j++){
        mat[i][j]=0;
    }
}

i = 0;
while (1)
{
    if (feof(fp))
        break;
    fscanf (fp, "%[^\n]%d %d %d", &mat[i][0], &mat[i][1], &mat[i][2]);
    i++;
}
fclose(fp);

for(i=0;i<3;i++){
    for(j=0;j<3;j++){
        printf("%d   ", mat[i][j]);
    }
    printf("\n");
}
int mat[3][3];
int i,j;
文件*fp;
字符c;
if((fp=fopen(“texto.txt”,“r”))==NULL){
printf(“错误al-abrir el-archivo”);
返回-1;
}
对于(i=0;iRead)。请注意,格式控制字符串中的空格也可能跳过换行符,
fscanf
返回扫描项目的数量(这对您应该很重要)。在某些情况下,您可能还对
%n
感兴趣

请注意,您对
fscanf
的使用是错误的(也是错误的),因为
%[^\n]
需要一个您没有提供的参数。有了这样一个好的编译器,您应该启用所有警告和调试信息(例如,使用
gcc-Wall-Wextra-g
编译),您将得到一个警告

如果要跳过第一行,请从读取每个字符(带)开始,直到获得
EOF
'\n'
。或使用或(在POSIX上,类似)读取并忽略第一行


如果行真的很重要,您可以读取每一行(例如,使用or)并分析每一行(例如,或其他)。

为什么不想使用第一行?您需要阅读它以了解矩阵将有多大
If(feof(fp))
-非常仔细地阅读
feof
的规范。这一行是错误的!@Olaf这确实是一个棘手的问题,我不知道我是否真的能从规范中理解它…也许值得一读并做一些解释@M.DEZ:不,不是!它完全错了。仅仅因为代码似乎在运行,并不意味着它是正确的!@M.DEZ你为什么不检查
fscanf()
的返回值?试着输出它,你会发现你对
feof()
的使用并不“正常”。我知道这是fscanf的错误用法,我尝试了不同的选项,我复制了最后一个,对不起。好的,我会尝试的,非常感谢!