首页 > 解决方案 > ifstream 不读取第一行

问题描述

我正在使用ifstream大约 1 年前使用的代码,但现在它无法正常工作。在这里,我有以下文件(所以,只有一行整数):

2 4 2 3

我在从该文件构建图表时阅读了它:

graph g = graph("file.txt");

其中图构造函数开始于:

#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

graph::graph(const char *file_name) {
    ifstream infile(file_name);
    string line;
    getline(infile, line);
    cout << line << endl; // first output
    istringstream iss;
    iss.str(line);
    iss >> R >> C >> P >> K;
    iss.clear();

    cout << R << " " << C << " " << P << " " << K; // second output
}

第二个输出(用代码标记)不是给我2 4 2 3,而是返回随机(?)值-1003857504 32689 0 0。如果我添加第一个输出来检查lineafter的内容getline,它只是一个空字符串""

所有文件(main.cpp实例化图形的位置,实现图形的“graph.cpp”和“file.txt”)都位于同一文件夹中。

正如我所提到的,这是我以前工作的旧代码,所以我可能没有看到一些明显的错误破坏了它。谢谢你的帮助。

标签: c++c++11

解决方案


这两个位置:

  • 程序的原始源代码所在的位置
  • 程序的输入数据所在的位置

完全无关的。

由于“file.txt”是相对路径,因此您的程序在执行期间会在当前工作目录中查找输入数据。有时这与可执行文件所在的位置相同。有时不是。(只有你能知道它是什么,因为它取决于你如何执行你的程序。)除了可能是偶然的,与原始源文件的位置没有任何联系。

当两者不匹配时,您会遇到此问题,因为您在程序中没有执行 I/O 错误检查。

如果您检查是否infile打开,我打赌您会发现它不是。

这一点尤其明显,因为程序在一段时间后停止工作而没有对其逻辑进行任何更改;很有可能,唯一可能改变的是解决方案中各种元素的位置。


推荐阅读