【问题标题】:C++ portability from Windows to Linux从 Windows 到 Linux 的 C++ 可移植性
【发布时间】:2020-01-15 17:29:16
【问题描述】:

我已经在 Windows 上的 C++ 中成功使用了以下代码(通过 CodeBlocks),最近还尝试通过 CodeBlocks 在 Linux(Ubuntu 18.04)上使用相同的代码。代码似乎可以正常编译,但执行失败。

代码的目的是将逗号分隔的数字文本文件导入数组。

在 Windows 和 Linux 中,我都使用 GNU GCC 编译器。

#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <cmath>
#include <iomanip>
#include <ctime>
#include <cstdio>
#include <stdlib.h>

using namespace std;

typedef vector <double> record_t;
typedef vector <record_t> data_t;

istream& operator >> ( istream& ins, record_t& record)
  {

  record.clear();

  string line;
  getline( ins, line );

  stringstream ss( line );
  string field;
  while (getline( ss, field, ',' ))
    {
    stringstream fs( field );
    double f = 0.0;  
    fs >> f;

    record.push_back( f );
    }

 return ins;
  }

//-----------------------------------------------------------------------------

istream& operator >> ( istream& ins, data_t& data )
  {
  data.clear();

  record_t record;
  while (ins >> record)
    {
    data.push_back( record );
    }
return ins;
  }

//-----------------------------------------------------------------------------

int main()
  {
  data_t data;

  ifstream infile( "Import File.txt" );
  infile >> data;

  if (!infile.eof())
    {
    cout << "Unsuccessful Import!\n";
    return 1;
   }

  infile.close();

  cout << "Your file contains " << data.size()-1 << " records.\n";

return 0;
  }

我已经检查了 Linux 上是否存在必要的头文件,并且似乎确实如此。

如果我注释掉 EOF 检查控制台返回的消息

Process returned 49 (0x31)

Linux下导入文件失败的sn-p是:

1138,1139,1137.25,1138.5
1138.25,1138.75,1138.25,1138.5
1138.75,1139,1138.5,1138.75
1138.75,1138.75,1138.25,1138.25
1138.25,1138.25,1137.5,1137.5
1137.5,1138.75,1137.5,1138.5
1138.75,1143.75,1138.75,1143
1143.25,1145.75,1143.25,1144.5
1144.5,1144.75,1143,1143.25
1143.5,1144.5,1143.25,1144.25

感谢您在寻找解决方案方面的任何帮助。

【问题讨论】:

  • 您能否举一个代码失败的输入文件的最小示例?
  • 我已经编辑了我的问题以包含文件的 sn-p,该文件可以在 Windows 下运行但在 Linux 下不可用。

标签: linux c++11 portability


【解决方案1】:

main 中的 return 4321; 向操作系统报告返回代码不成功。只有0 返回码(又名EXIT_SUCCESS)被认为是成功的。

将其更改为return 0 或完全删除该return 语句(在C++ 中main 具有隐含的return 0)。

【讨论】:

  • 谢谢。我已经进行了更改,但不幸的是,它并没有解决问题。
  • @Jamesh99 我相信它可以解决您报告的问题,但是您的代码还有其他问题。您可能想问另一个问题,因为 SO 不是一个调试服务,您可以在获得以前问题的解决方案时更新您的问题(如您所做的那样)。