C++ 使用 *i 指针打开文件,在 Linux 中覆盖但在 Windows 中不覆盖

标签 c++ linux pointers call

所以我已经让这个程序在 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”连接到末尾,它就会覆盖“Tigers”,而我只剩下“List.txt”

例如:

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

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

我做错了什么???

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

最佳答案

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

Tigers\r\n

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

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

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

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

关于C++ 使用 *i 指针打开文件,在 Linux 中覆盖但在 Windows 中不覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26519645/

相关文章:

C++ .ignore 给出错误 "This declaration has no storage class or type specifier"

java - 从 Java 跳到 C

c++ - 将中缀转换为后缀并得到段错误核心转储错误

linux - linux中如何获取一个进程的内存

linux - greenplum gpload : configuration YML file error

c - qsort比较功能不起作用

c - strtok() 覆盖它的源字符串

c++ 在低内存系统上。标准库正在使用所有内存!

linux - 为什么bashrc中的这个功能不起作用?

c - 为什么我从来没有超过1?