【问题标题】:C++ Opening file with *i pointer, Overrides in Linux but not in WindowsC++ 使用 *i 指针打开文件,在 Linux 中覆盖但在 Windows 中不覆盖
【发布时间】:2014-10-23 01:01:08
【问题描述】:

所以我已经让这个程序在 Windows 中运行,并且我正在尝试让它也可以在 Linux 机器上运行。我相信 Linux 机器正在运行一个过时版本的 g++ 编译器,但这超出了我的控制。无论如何,这是我的功能:

for (vector<string>::iterator i = groups.begin(); i != groups.end(); ++i)
{
    inStream.open((*i + "List.txt").c_str());
    while (getline(inStream, next))
    {
        if (next == n) {
            memberOf.push_back(*i);
        }
    }
    inStream.close();
}

问题在于 inStream.open() 调用。在 Windows 中这工作正常,但在 Linux 中似乎 *i(例如,假设 *i 指向“Tigers”)被覆盖,因此调用只是 inStream.open("List.txt");而不是 inStream.open("TigersList.txt");

我尝试了各种方法来解决这个问题,例如设置 string k = *i;从某种意义上说,如果我调用 cout

例如:

k += "List.txt";
k.append("List.txt");

等等。在 Linux 中似乎没有任何效果,但是我尝试过的所有东西在 Windows 中都有相同(正确)的最终结果。

我做错了什么???

编辑:inStream 是一个 ifStream 对象。 memberOf 是另一个字符串向量。

【问题讨论】:

  • 与您的问题无关,但不是使用迭代器的凌乱的for 循环,而是在 C++ 11 中尝试基于范围的for 循环:for ( string s : groups ) {inStream.open( ( s + "List.txt" ).c_str() );...(也许您过时的编译器无法识别这个构造..)

标签: c++ linux pointers call


【解决方案1】:

听起来您正在从包含 Windows 行尾的文件中读取 Tigers。如果您在 Linux 中阅读此文件,则阅读该行:

Tigers\r\n

将导致您在内存中的字符串为Tigers\r。然后当你连接它时,即使结果实际上最终是Tigers\rList.txt,当你打印出来时,你的终端会将\r 视为回车,因此List.txt 会覆盖屏幕上的Tigers

当然,打开文件会失败,因为文件名不包含嵌入的\r

要解决此问题,您可以执行以下操作之一:

  • 在 Linux 中,确保您打开的文件具有 Linux 行结尾(例如,在其上运行 dos2unix
  • 更新您的程序以查找并丢弃它从文件中读取的行末尾的\r

【讨论】:

  • 谢谢!你是对的,我正在阅读从 Windows 复制的 .txt 文件。我使用 linux 重新创建了文件,现在它可以完美运行了哈哈
猜你喜欢
  • 2015-12-23
  • 2019-05-06
  • 2011-08-04
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 2010-10-17
相关资源
最近更新 更多