我想比较两个字符串。这是我的代码。
string line;
getline(cin, line);
if(line.compare("% Input alphabet")==0)
dosomething;
问题是以下代码在Windows机器上使用mingw时正常工作,但是当我在我的ubuntu vm上运行相同的代码时,它不执行dosomething方法。我编译了我的程序并运行了以下命令
在Windows上
a.exe< input.txt中
在Ubuntu上
./ a.out< input.txt
答案 0 :(得分:2)
我建议最后修剪\r\n
个符号。这是Window(\ r \ n)和Unix(\ n)之间的唯一区别。
使用boost::trim()
执行此操作
答案 1 :(得分:0)
您使用的是在Windows上创建的完全相同的input.txt
文件,然后传输到Linux计算机吗?如果是,那么这可能会导致您描述的问题。
这个想法是C ++流基于平台不同地处理行结束字符(如果你不打开二进制模式的流)。这行代码:
someTextFileStream << "some text\n";
如果在Windows上运行,实际上会在行末写入\r\n
,如果在Linux上运行则只会写\n
。
从文本流中读取时也是如此,在Windows上\r\n
将被解释为单个新行字符/分隔符,仅在Linux上\n
将被解释为新行字符。
现在,如果您在Windows上创建一个文本文件(例如,使用记事本),它将如下所示:
some text written on Windows\r\n
如果您在Windows上使用getline()
来阅读此内容,则getline()
填充的字符串将包含some text written on Windows
。
如果您在Linux上传输此文件(因此它与Windows文件的二进制文件完全相同),然后再次使用getline()
读取该文件,则该字符串实际上将包含some text written on Windows\r
。这是因为在Linux上,新的行分隔符为\n
,因此getline()
会停止。
可能的解决方案:从文件中读取后修剪线条;检测行结束分隔符并在代码中适当地转换/处理它;在创建文件时,代码运行的平台使用正确的行结尾。