所以我已经让这个程序在 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/