gpt4 book ai didi

c++ - Windows 和 Linux 之间的程序输出不同。为什么?

转载 作者:太空宇宙 更新时间:2023-11-04 10:16:58 24 4
gpt4 key购买 nike

我在 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;
}

这是在代码中声明的“raw_file”中的输入;

/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/

最佳答案

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在将值用作 char 之前查看结果是否为 Traits::eof()

关于c++ - Windows 和 Linux 之间的程序输出不同。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45683682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com