【问题标题】:Dont read the first line of a text in C不要阅读 C 中文本的第一行
【发布时间】:2017-06-19 11:03:32
【问题描述】:

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

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。

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

谢谢!

【问题讨论】:

  • 为什么不想使用第一行?您需要阅读它才能知道矩阵有多大
  • if (feof(fp)) - 阅读feof的规范非常仔细。这行错了!
  • @Olaf 这真的是一个棘手的问题,我不知道我是否真的能从规范中理解它......可能值得一读并提供一些解释stackoverflow.com/questions/5431941/…
  • @M.DEZ:不,不是!这是完全错误的。仅仅因为代码出现可以运行,并不意味着它是正确的!
  • @M.DEZ 为什么不检查fscanf() 的返回值?尝试输出它,您会发现您对feof() 的使用不是“工作正常”。

标签: c file matrix scanf


【解决方案1】:

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

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

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

如果行真的很重要,您可以阅读每一行(例如使用fgetsgetline(3))并使用例如解析每一行sscanf 或其他。

【讨论】:

  • 我知道这是 fscanf 的错误用法,我尝试了不同的选项,我复制了最后一个,抱歉。好的,我试试,非常感谢!
猜你喜欢
  • 2020-09-27
  • 2013-04-17
  • 2015-05-16
  • 1970-01-01
  • 2021-06-30
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多