【问题标题】:How do I read long lines from a text file in C++?如何从 C++ 中的文本文件中读取长行?
【发布时间】:2010-05-26 07:20:58
【问题描述】:

我正在使用以下代码从文本文件中读取行。处理线大于限制 SIZE_MAX_LINE 的情况的最佳方法是什么?

void TextFileReader::read(string inFilename)
{
    ifstream xInFile(inFilename.c_str());
    if(!xInFile){
        return;
    }

    char acLine[SIZE_MAX_LINE + 1];

    while(xInFile){
        xInFile.getline(acLine, SIZE_MAX_LINE);
        if(xInFile){
            m_sStream.append(acLine); //Appending read line to string
        }
    }

    xInFile.close();
}

【问题讨论】:

  • 其实我很想知道如何处理函数设置的eofbit和failbit
  • 如果你使用 std::strings 你不需要测试大小限制
  • 那么读取一行的大小是多少?
  • 无论读取行的大小。 std::string在运行时根据需要动态扩展。

标签: c++


【解决方案1】:

不要使用istream::getline()。它处理裸字符缓冲区,因此容易出错。更好地使用来自<string> 标头的std::getline(std::istream&,std::string&, char='\n')

std::string line;

while(std::getline(xInFile, line)) {
    m_sStream.append(line);
    m_sStream.append('\n'); // getline() consumes '\n'
}

【讨论】:

  • 这个怎么样? istream_iterator 游标(xInFile); istream_iterator 结束标记;而(光标!= endmarker){ m_sStream.append(*光标);光标++; }
  • @sonofdelphi:IIUC,这将读取 words,而不是 lines(其中“word”是由空格分隔的任何内容)。为了让它读取行,您必须使用读取行而不是单词的类型来实例化 std::istream_iterator。想出这样的类型应该不难,但标准库中没有。
【解决方案2】:

既然您已经在使用 C++ 和 iostream,为什么不使用 std::stringgetline function

std::string acLine;
while(xInFile){
    std::getline(xInFile, acLine);
    // etc.
}

并且,使用xInFile.good() 来确保eofbitbadbitfailbit没有设置。

【讨论】:

  • 我会做"while(std::getline(xInFile, acLine)) {}"
  • Kenny,当输入失败时,这将尝试处理 // etc. 部分中的旧数据。 (如果字符串是函数的本地字符串,它至少是一个空字符串。)最好使用 Nikko 的成语。见my answer
【解决方案3】:

如果您在字符串中使用free function,则不必传递最大长度。它也使用 C++ 字符串类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多