我在Windows和Linux中运行代码。 在Window中,我可以获得我想要的结果,但是在Linux中,我得到的结果与我从Window获得的结果不同。
导致这种差异的原因是什么以及如何在Linux中修复代码?
非常感谢! :)我附加了两个操作系统的代码,输入和结果。
以下是我的代码; (此代码是使用点反向排序组件并使用斜杠区分组件。)
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
string set_name = "6000k";
// in
string raw_file = set_name + "_filtered.txt";
// out
string set_file = set_name + "_filtered_dot.txt";
// main
int main()
{
int i = 0;
string comp = "";
string str;
vector<string> input_comp;
vector<string> tmp_comp;
int input_order = 0;
ifstream infile;
infile.open(raw_file);
ofstream outfile;
outfile.open(set_file);
if (infile.fail()) // error handling
{
cout << "error; raw_file cannot be open..\n";
}
while (!infile.fail())
{
char c = infile.get();
if (c == '\n' || c == '/')
{
if (comp != "")
{
input_comp.push_back(comp);
}
int num = input_comp.size();
for (int j = 0; j < num; j++)
{
int idx = (num - 1) - j;
outfile << "/" << input_comp[idx];
}
if (c == '\n')
{
outfile << "/" << endl;
}
input_comp.clear();
str = "";
comp = "";
}
else if (c == '.')
{
if (comp != "")
{
input_comp.push_back(comp);
}
comp = "";
}
else
{
str = c;
comp = comp + str;
}
}
infile.close();
outfile.close();
return 0;
}
这是&#39; raw_file&#39;中的输入。在代码中声明;
/blog.sina.com.cn/mouzhongshao
/blogs.yahoo.co.jp/junkii3/11821140.html
/allplayboys.imgur.com
这是Window的结果; (这是我想从上面的代码中得到的)
/cn/com/sina/blog/mouzhongshao/
/jp/co/yahoo/blogs/junkii3/html/11821140/
/com/imgur/allplayboys/
这是Linux的结果; (意外结果)
/cn/com/sina/blog/mouzhongshao
/
/jp/co/yahoo/blogs/junkii3/html
/11821140/
/com
/imgur/allplayboys/
答案 0 :(得分:1)
Windows使用复合行尾:回车和换行(\r\n
)。当C ++文件流以文本模式打开文件时,默认情况下会找到\r\n
,它会以静默方式将其转换为\n
。
Linux仅使用换行符(\n
)。当文件流找到\r\n
时,\r
被视为常规字符并传递给解析器。
所以在Linux上/blog.sina.com.cn/mouzhongshao\r\n
被分解为
<empty>
blog
sina
com
cn
mouzhongshao\r
根据控制台的处理方式\r
可能会打印
/cn/com/sina/blog/mouzhongshao
/
或
/cn/com/sina/blog/mouzhongshao
使用回车将光标移回到行的开头,并用最后一个覆盖第一个/
。
简单的解决方案是将输入文件转换为Linux样式的行结尾。许多Linux文本编辑器都内置了DOS到Unix格式转换实用程序。还有广泛使用的dos2unix应用程序。如果所有其他方法都失败了,请在Linux下重写该文件。
更长的解决方案是使Windows和Linux的行为相同。这方面的许多例子已经存在。这是一个:Getting std :: ifstream to handle LF, CR, and CRLF?
请注意while (!infile.fail())
因为它在阅读前测试可读性,这意味着所有后续阅读都可能失败并且您不会知道。更多相关内容:Why is iostream::eof inside a loop condition considered wrong?
要解决此问题,请不要立即将infile.get();
的结果投射到char
保持int
一段足够长的时间,以便在使用之前查看结果是否为Traits::eof()
值为char
。