2017-08-14 1 views
0

WindowsとLinuxの両方でコードを実行します。 Windowでは、私が意図した結果を得ることができますが、LinuxではWindowから取得したものとは異なる結果になります。WindowsとLinuxのプログラム出力が異なります。どうして?

この違いとLinuxでコードを修正する方法の原因は何ですか?

ありがとうございます! :)私は両方のOSからコード、入力、および結果を添付しました。

以下は私のコードです。 (このコードは、逆ドットで構成要素を注文し、スラッシュを使用してコンポーネントを区別することである。)

#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の結果です。 (予期しない結果)

​​1
+2

while(!infile.fail()) 'は読み込み前にエラーをチェックします。これがうまくいくとは思わないでください。 – user4581301

+0

最後の値には、linuxの改行文字が含まれているようです(例えば、 "html"の代わりに '" html \ n "') – Justin

+0

入力ファイルがウィンドウ上に作成された場合は、 n。これは\ rを出力するので、Linux上で出力を乱すでしょう。 – user4581301

答えて

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 

を印刷することができるに分割され

カーソルを行の先頭に戻し、t彼は最初に/を上書きします。

簡単な解決策は、入力ファイルを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?

これを解決するには、すぐに結果がcharとして値を使用する前にTraits::eof()であるかどうかを確認するのに十分なint長く、それを保管してくださいcharinfile.get();の結果をキャストしないでください。

+0

私はWindowにコードを書いたので、この違いが生じています。私はWindowとLinuxの間で異なる行末(\ r \ nと\ n)を考えなかった。明確な説明をありがとう! :) – jjjhseo

関連する問題