使用getline()的问题

时间:2012-01-26 20:16:18

标签: c++ file

我的头发已用完了,所以我想也许有人可以帮助我解决这个问题。

我正在尝试逐行读取文件,这看起来很简单,使用getline()。问题是,我的代码似乎一直忽略\ n,并将整个文件放到一个字符串中,这至少可以说是个问题。

void MakeRandomLayout(int rows, int cols)
{
    string fiveByFive = "cubes25.txt";
    string fourByFour = "cubes16.txt";

    ifstream infile;

    while (true) {
        infile.open(fourByFour.c_str());
        if (infile.fail()) {
            infile.clear();
            cout << "No such file found";
        } else {
            break;
        }
    }

    Vector<string> cubes;
    string cube;
    while (std::getline(infile, cube)) {
        cubes.add(cube);
    }
}

编辑:运行OSX 10.7。 文件的无限循环未完成,最终将要求提供文件。 没有运气扩展的getline()版本,之前尝试过。 开发和构建/运行的系统相同。

我正在阅读的文本文件如下所示:

AAEEGN
ABBJOO
ACHOPS
AFFKPS
AOOTTW
CIMOTU
DEILRX
DELRVY
DISTTY
EEGHNW
EEINSU
EHRTVW
EIOSST
ELRTTY
HIMNQU
HLNNRZ

每个字符串都在文件的新行中。我没有读到的第二个是相同的25行,而不是16

2 个答案:

答案 0 :(得分:1)

我怀疑您未能正确显示Vector的内容。转储Vector时,每次输入后是否打印\n?您应该,因为getline会丢弃输入上的换行符。

仅供参考:逐行阅读的典型模式是:

Vector<string> cubes;
string cube;
while(std::getline(infile, cube)) {
  cubes.add(cube);
}

请注意,这将丢弃换行符,但会在Vector中为每个条目添加一行。

<小时/> 编辑:无论价值多少,如果您使用的是std::vector,您都可以将文件粘贴在一起:

std::ifstream ifile(av[1]);
std::vector<std::string> v(
  (std::istream_iterator<std::string>(ifile)),
  std::istream_iterator<std::string>());

答案 1 :(得分:1)

Mac软件将'\r''\n'识别为行尾,以便向后兼容Mac OS Classic。当您的处理代码需要'\r'时,请确保文本编辑器没有在文件中添加'\n'行结尾(并验证您认为'\n'个字符位于实际上,字符串不是'\r'