2017-08-14 167 views
0

我在Windows和Linux中運行代碼。 在Window中,我可以得到我想要的結果,但在Linux中,我從Window獲得了不同的結果。Windows和Linux之間的程序輸出不同。爲什麼?

是什麼導致了這種差異,以及如何修復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的結果; (意外結果)

​​
+2

'while(!infile.fail())'在讀取之前檢查失敗。不要指望這個工作。 – user4581301

+0

最終值似乎包括linux上的換行符(例如''html \ n「'而不是''html'') – Justin

+0

如果輸入文件是在Windows上創建的,它將包含窗口行尾:\ r \ ñ。這會在Linux下搞亂你的輸出,因爲它會打印\ r。 – 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?

要解決此問題,不要立即施放的infile.get();結果到char保持它的int足夠長的時間,看看結果是Traits::eof()使用值作爲char之前。

+0

我在Window中編寫了代碼,這就是造成這種差異的原因。我沒有想到Window和Linux之間的不同行結尾(\ r \ n和\ n)。感謝您的明確解釋! :) – jjjhseo

相關問題