【问题标题】:getline() returns empty line in Eclipse but working properly in Dev C++getline() 在 Eclipse 中返回空行,但在 Dev C++ 中正常工作
【发布时间】:2010-03-30 05:34:12
【问题描述】:

这是我的代码:

#include <iostream>
#include <stdlib.h>
#include <fstream>

using namespace std;

int main() {
    string line;
    ifstream inputFile;
    inputFile.open("input.txt");

    do {
        getline(inputFile, line);
        cout << line << endl;
    } while (line != "0");

    return 0;
}

input.txt 内容:

5 9 2 9 3
8 2 8 2 1
0

在 Enclipse 中,它进入无限循环。我正在使用 MinGW 5.1.6 + Eclipse CDT。

我尝试了很多东西,但我找不到问题。

【问题讨论】:

  • 如果指定“input.txt”的绝对路径而不是相对路径会怎样?
  • 它进入一个无限循环,因为您没有在条件下检查文件的状态。您应该检查文件的状态(看看它是否变坏了)并检查终止顺序。请参阅下面的答案。

标签: c++ getline


【解决方案1】:

既然你在 Windows 上试试:

} while (line != "0\r");

最后一行存储为"0\r\n"\n 被 getline 用作行分隔符,因此实际读取的行将是 "0\r"

您可以使用命令将dos格式文件转换为UNIX格式

dos2unix input.txt

现在您的原始程序应该可以运行了。该命令会将行尾的\r\n更改为\n

此外,您应该在尝试打开文件后始终进行错误检查,例如:

inputFile.open("input.txt");
if(! inputFile.is_open()) {
 cerr<< "Error opening file";
 exit(1);
}

【讨论】:

  • 你是对的。当我将代码更改为: inputFile.open("C:\\workspace\\project\\input.txt");有用。但为什么? input.txt 位于同一文件夹中。 Dev C++和Eclipse有什么区别?
  • @pocoa:当前目录不同。 Eclipse CDT 允许您在项目的“运行/调试设置”属性(在“(x)= Arguments”选项卡上)中指定此项。我没有开发 C++ 的经验,所以我不知道你会去哪里指定运行构建程序的工作目录。
  • @Michael Burr:你知道怎么做吗?
  • @pocoa:不幸的是,仅此而已。
【解决方案2】:

如果没有一行正好包含0,它将创建一个无限循环。例如0\n0 不同。我猜那是你的问题。

编辑:详细说明,getline 应该丢弃换行符。也许你的文件的换行编码错误(即 windows 与 unix)。

【讨论】:

  • 澄清一下 - 以0\n 结尾的输入文件应该没问题,但是如果输入文件在@987654326 之后有空格(\n 除外),则会出现问题@。所以'0 \n' 会失败,'0\r\n' 会失败,这可能是由 Unix vs DOS 行尾编码问题引起的。
  • 我在 Windows 上运行它们。在 Dev C++ 上运行相同的文本文件和代码,但在 Eclipse 上失败。
【解决方案3】:

您的主要问题是工作目录。
因为您使用相对路径指定文件,所以它会从当前工作目录中搜索文件。工作目录可以由您的开发环境指定。 (注意:工作目录不一定与可执行文件所在的目录相同(这是初学者的常见假设,但仅在非常特殊的情况下才成立)。

虽然您有一个特殊的输入标记“0”结尾,但您还应该检查 getline() 是否没有失败(因为它可能由于其他原因(包括格式化输入)而出错。因此,通常最好阅读时检查文件的状况。

int main()
{
    string   line;
    ifstream inputFile;
    inputFile.open("input.txt");

    while((getline(inputfile, line)) && (line != "0"))
    {
        // loop only entered if getline() worked and line !="0"
        // In the original an infinite loop is entered when bad input results in EOF being hit.

        cout << line << endl;
    }
    if (inputfile)
    {
        cout << line << endl; // If you really really really want to print the "0"
                             // Personally I think doing anything with the termination
                             // sequence is a mistake but added here to satisfy comments.
    }

    return 0;
}

【讨论】:

  • 你的程序不会打印最后一行。
  • True:但我认为这是 poca 的一个编程错误,因为您通常不想打印数据终止序列,它在数据方面没有任何意义。但它很容易修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2019-02-03
  • 2021-11-13
相关资源
最近更新 更多