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

C++ Opening file with *i pointer, Overrides in Linux but not in Windows

本文关键字:覆盖 Linux 但在 Windows 文件 使用 指针 C++      更新时间:2023-10-16

所以我已经让这个程序在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")似乎被覆盖了,因此调用只是在Stream.open("List.txt")中;与inStream.open("TigersList.txt")相反;

我尝试了各种方法来解决这个问题,比如设置字符串k=*I;它本身就起作用,如果我称cout<lt;k上面印着"老虎"。然而,当我试图将"List.txt"连接到最后时,它就会覆盖"Tigers",我只剩下"List.txt"

例如:

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

等等。Linux中似乎什么都不起作用,但我尝试过的所有操作在windows中都有相同的(正确的)最终结果。

我做错了什么???

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

听起来像是从一个包含Windows行尾的文件中读取Tigers。如果您在Linux中读取此文件,则读取以下行:

Tigersrn

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

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

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

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