【问题标题】:Problems with reading text from a file [duplicate]从文件中读取文本的问题[重复]
【发布时间】:2013-08-29 04:50:14
【问题描述】:

我有这个函数可以从文件中读取文本并将其添加到字符串中,现在奇怪的是,如果它是一个短文本,它就可以正常工作。但是,如果它的文本较长,则字符串变为空,感谢任何解决此问题的帮助。

 string inlasning(string namn)
{
    string filString, temp;

    ifstream filen(namn.c_str());

    if(!filen.good())
    {
        cout << "Otillganglig fil" << endl;
        filString = "ERROR";
        return filString;
    }
    else
    {
        while(!filen.eof())
            getline(filen, temp);
            filString.append(temp);
    }

    filen.close();
    return filString;

}

【问题讨论】:

  • 检查您的数据是否有新行分散在字符串中间。

标签: c++ getline


【解决方案1】:

1) 不要使用eof() 来控制循环。将getline 直接放入循环条件中。如果您在执行此操作时遇到问题,请搜索 StackOverflow。

2) 您的 while 循环没有大括号,因此仅涵盖 getline 行,尽管您的缩进具有误导性。

3) getline 丢弃换行符。你的最后一个字符串是错误的。

4) 您观察到的实际行为来自这样一个事实,即您只将getline 返回的最后一个内容附加到您的字符串中。当您的文件包含一行文本并且不以换行符结尾时,这似乎可行。如果它有更多行但没有以换行符结尾,您只会得到最后一行。如果文件确实以换行符结尾,由于您不正确的循环条件,最后一次调用 getline 实际上会给您一个空字符串,这正是您的字符串的内容。

【讨论】:

    【解决方案2】:

    替换

    while(!filen.eof())
        getline(filen, temp);
        filString.append(temp);
    

    while(!filen.eof())
    {
        getline(filen, temp);
        filString.append(temp);
    }
    

    【讨论】:

      【解决方案3】:

      使用“is_open()”检查文件是否存在:

      if( ! filen.is_open() ){...} // 你不需要 else 子句

      ...而且您的 while 循环必须有大括号,否则它只会执行 getline(...) 指令:

      while( filen.good() ) {
          getline( filen , temp );
          filString += ( temp + '\n' );
      }
      

      如果您的文件不以 '\n' 结尾,请从字符串中删除最后一个字符

      【讨论】:

        猜你喜欢
        • 2019-07-01
        • 2011-11-23
        • 1970-01-01
        • 2011-09-28
        • 2018-05-14
        • 2017-11-05
        • 2013-11-20
        • 1970-01-01
        相关资源
        最近更新 更多