不要读C中文本的第一行

时间:2017-06-19 11:03:33

标签: c file matrix scanf

我有一个这样的文本文件:

3 3 0

2 3 5

3 8 9

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");
}

(对不起西班牙语行)

我没有写malloc,因为我只是想知道我是否正确地创建矩阵,因为它是3x3。

所以问题是我不知道如何从文本文件的第二行创建矩阵,并且不使用第一行。

谢谢!

1 个答案:

答案 0 :(得分:2)

阅读documentation of fscanf。请注意,格式控制字符串中的空格也可以跳过换行符,并且fscanf返回已扫描项目的数量(这对您来说很重要)。在某些情况下,您可能也会对%n感兴趣。

请注意,您对fscanf的使用是错误的(undefined behaviour也是如此),因为%[^\n]期望您提供的参数不合适。使用像GCC这样的良好编译器,您应该启用所有警告和调试信息(例如使用gcc -Wall -Wextra -g进行编译),然后您将收到警告。

如果您想跳过第一行,请先阅读每个字符(fgetc),直至获得EOF'\n'。或者使用fgetsgetline(3)(在POSIX上,如this)来阅读并忽略第一行。

如果行确实很重要,您可以阅读每一行(例如,使用fgetsgetline(3)),并使用例如{ sscanf或其他。