【问题标题】:list not displaying from txt file列表未从 txt 文件中显示
【发布时间】:2014-04-08 23:36:46
【问题描述】:
void main() {
    nodLista* LS=NULL;
    FILE* F=fopen("asaceva.txt","r");
    if(F!=NULL) {
        char buffer[100]; int id;float pret;
        fscanf(F,"d",&id);
        while(!feof(F)) {
            fscanf(F,"f",&pret);
            fscanf(F,"s",buffer);
            Produs* p= creareProdus(id,pret,buffer);
            LS=inserareSfarsit(LS,*p);
            fscanf(F,"%d",&id);
        }
        afisareLista(LS);
    }
    _getch();
}
  • afisareLista:显示列表
  • inserareSfarsit: 在末尾插入

我不明白为什么它没有从 txt 文件中获取数据。你能解释一下为什么吗?

【问题讨论】:

  • 这是int main,而不是void mainwhile (!eof()) is wrong. 你最好使用 <fstream>std::string 而不是 C 风格的 IO。
  • 这就是我被教导使用它们的方式。为什么 feof 错了?
  • @mariusxd 他链接到的问题中的答案回答了该问题。
  • fscanf 的格式说明符需要%
  • 链接解释得很好,同样的逻辑也适用于 C IO。它很容易导致单独阅读的错误,更不用说它在使用之前不检查输入是否成功。您还要求fscanf 读取到buffer 的缓冲区溢出。改用someFileStream >> someCppString; 可以很容易地避免这种溢出。

标签: c++ list linked-list queue


【解决方案1】:

您的代码中有几个问题:

  • main 不返回整数。
  • 没有一致且正确地使用 fscanf 和占位符。
  • 您没有检查 fscanf 的返回值是否失败。
  • 如果您有可用的 C++11 支持,则应将 NULL 替换为 nullptr。

正确的代码应该是这样的:

int main() {
    nodLista* LS=NULL;
    FILE* F=fopen("asaceva.txt","r");
    if(F!=NULL) {
        char buffer[100]; int id;float pret;
        if (!fscanf(F,"%d",&id))
            cout << "Error happened: " << ferror(F) << ", error string: " << strerror(errno) << endl;
        while(!feof(F)) {
            if (!fscanf(F,"%f",&pret))
                cout << "Error happened: " << ferror(F) << ", error string: " << strerror(errno) << endl;
            if (!fscanf(F,"%s",buffer))
                cout << "Error happened: " << ferror(F) << ", error string: " << strerror(errno) << endl;
            Produs* p= creareProdus(id,pret,buffer);
            LS=inserareSfarsit(LS,*p);
            if (!fscanf(F,"%d",&id))
                cout << "Error happened: " << ferror(F) << ", error string: " << strerror(errno) << endl;
        }
        afisareLista(LS);
    }
    _getch();
    return 0;
}

【讨论】:

  • main() 不必有返回声明。
  • @0x499602D2:您误读了答案。我没有说它必须返回零。我说它必须返回一个整数!
  • @0x499602D2: main() 是一个特例。
  • @LaszloPapp:仍然没有正确检查输入失败。
  • @Deduplicator:取决于...有些人喜欢只指出真正的问题,有些人喜欢指出每一个错误,甚至与问题无关。这完全取决于个人品味,真的不值得争论。话虽如此,这次我很高兴你避免进一步争论,因为我对此并不强烈。 :)
猜你喜欢
  • 2014-06-18
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多