【问题标题】:fscanf does not retrieve any valuefscanf 不检索任何值
【发布时间】:2020-03-15 03:38:59
【问题描述】:

我有一个包含空格分隔值的文件 例如:

6028    5   6
9813    2   10
10249   7   8
10478   8   8
10479   3   2
10516   6   3
10519   9   10
10525   3   7
10606   6   1
10611   6   9
10632   1   6
10638   9   4

而且我无法使用以下代码将它们检索到变量中:

#include <stdio.h>
#include <stdlib.h>
void ReadVector(int V[], int *N);
int CalcularAprovados(int V[], int N);


void ReadVector(int V[], int *N){
    FILE *f;
    f = fopen("dados4.txt", "r");
    if (f == NULL){
        printf("Error");
    }
    int nAluno, nTeste, nTrab;
    while(fscanf(f, "%d%d%d\n", &nAluno, &nTeste, &nTrab) == EOF){
        //fscanf(f, "%d %d %d", &nAluno, &nTeste, &nTrab);
        printf("%d %d %d\n", nAluno, nTeste, nTrab);
    }
    fclose(f);
}

int main(){
    int *V, N=0;
    ReadVector(&V[0], &N);
}

还有

int nAluno, nTeste, nTrab;
    while(fscanf(f, "%d%d%d\n", &nAluno, &nTeste, &nTrab) == EOF){
        //fscanf(f, "%d %d %d", &nAluno, &nTeste, &nTrab);
        printf("%d %d %d\n", nAluno, nTeste, nTrab);
    }

不起作用我希望它更新变量内容,直到它到达文件末尾。

【问题讨论】:

  • 你的意思是!= EOF?但即使这样也不正确。最好有== 3
  • 不要将\n 放在带有scanf() 的格式字符串中。数字会自动由空格分隔,您不需要。如果最后一行不以换行符结尾会导致问题。
  • 我先试过不带 \n 还是不行,加上 ==3 也不行...
  • 那么请比“不起作用”更详细地描述问题。你到底在观察什么?
  • if (f == NULL) 的情况下,您应该中止程序,而不是继续调用 fscanf

标签: c loops scanf c99


【解决方案1】:

检查错误。应该是:

int status;
while((status = fscanf(f, "%d%d%d\n", &nAluno, &nTeste, &nTrab)) > 0) {
    if (status == 3) {
        printf("%d %d %d\n", nAluno, nTeste, nTrab);
    }
}

【讨论】:

  • 不,您应该检查返回值的数量。例如,如果文件包含字符串,它可能会返回0。基本上没有任何理由使用 scanf 系列检查 EOF
  • 如果发生读取错误或读取时到达文件末尾,则设置正确的指示符(feof 或 ferror)。而且,如果在任何数据被成功读取之前发生任何一种情况,则返回 EOF。
  • 基本上他应该检查该值是否大于0。
  • 测试 ==3 似乎最好,好像是 1 或 2 那么这是需要处理的错误(某些输出字段将不正确或垃圾)
  • 我同意你的 cmets,但是,主要问题是在他的代码中他从不进入循环。答案表明了缺陷。它没有说所有变量都应该更新或数据不应该被破坏。这可能是记者的意图,但请求中并没有明确说明。
猜你喜欢
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
相关资源
最近更新 更多