我有一个这样的文本文件:
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。
所以问题是我不知道如何从文本文件的第二行创建矩阵,并且不使用第一行。
谢谢!
答案 0 :(得分:2)
阅读documentation of fscanf
。请注意,格式控制字符串中的空格也可以跳过换行符,并且fscanf
返回已扫描项目的数量(这对您来说很重要)。在某些情况下,您可能也会对%n
感兴趣。
请注意,您对fscanf
的使用是错误的(undefined behaviour也是如此),因为%[^\n]
期望您提供的参数不合适。使用像GCC这样的良好编译器,您应该启用所有警告和调试信息(例如使用gcc -Wall -Wextra -g
进行编译),然后您将收到警告。
如果您想跳过第一行,请先阅读每个字符(fgetc
),直至获得EOF
或'\n'
。或者使用fgets
或getline(3)(在POSIX上,如this)来阅读并忽略第一行。
如果行确实很重要,您可以阅读每一行(例如,使用fgets
或getline(3)),并使用例如{ sscanf
或其他。