2017-03-27 84 views
-1

我有一個壓縮分配的功能(由於2天前,我只是想知道出了什麼問題)。將文件寫入文件的錯誤

它應該輸出到標準輸出或寫入文件。 stdout輸出100%準確。

但是,二進制文字總是會產生垃圾。例如。它應該是23個字節的輸出,但總是16個字節,並不像它應該是什麼。我盯着這個2個小時,有誰能提供一個暗示有什麼不對?

非常感謝。

void writer(char character, int count,std::string outputpath){ 
    if(outputpath == "cout"){ 
     switch(count){ 
      case 1:{ 
       std::cout << character; 
       break; 
      } 
      case 2:{ 
       std::cout << character<< character; 
       break; 
      } 
      default:{ 
       std::cout << character; 
       auto output = conversion(count); 
       for(auto i: *output){ 
        std::cout << i; 
       } 
      } 
     } 
    }else{ 

     std::vector<std::bitset<8>> source; 
     std::bitset<8>temp(character); 
     switch(count){ 
      case 1:{ 
       source.push_back(temp); 
       break; 
      } 
      case 2:{ 
       source.push_back(temp); 
       source.push_back(temp); 
       break; 
      } 
      default:{ 
       source.push_back(temp); 
       auto output = conversion(count); 
       for(auto i: *output){ 
        source.push_back(i); 
       } 
      } 
     } 

     //write 
     { 
      std::ofstream file(outputpath, std::ios::binary) ; // output file stream 

      // write the contents of the vector to the file 
      for(auto i : source){ 
       file.write(reinterpret_cast<const char*>(&i), 8) ; 
      } 
     } 
    } 
} 
+0

什麼是輸入?什麼是輸出?正確的文本和不正確的二進制輸出 - 你可以用hexdump或類似的東西來檢查後者。什麼是_expected_二進制輸出? – Useless

+1

main()函數在哪裏可以讓我們重現問題,而不用猜測'writer()'的參數,並且自己寫main()'?並且,在你盯着2小時的時候,你是否試圖縮小錯誤的範圍?通過添加一些「檢查我的假設」輸出?什麼是'conversion()'?如果它很重要,爲什麼不包括它的定義?如果沒關係,爲什麼在你的例子中被調用?縮小範圍。這是調試101. – DevSolar

+0

我想知道爲什麼你有兩個完全不同的路徑通過'writer()'輸出標準輸出。你可以對輸入做完全相同的事情,然後決定是否將'write()'寫入'std :: cout'或'file' ......另外,還有'reinterpret_cast'。這是一種代碼味道,這種演員陣容幾乎是*永遠不會真的需要。 – DevSolar

回答

0
file.write(reinterpret_cast<const char*>(&i), 8) ; 

的第二個參數是write()字符將寫入的數量。 &i是8 位集的位置。

所有其他問題與您的來源放在一邊(你可能應該去codereview.SE),應該是1,而不是8

另外,在每次撥打writer()時,您將重新打開輸出文件,覆蓋過程中的內容。


您沒有向我們顯示調用代碼。但通過一個簡單的調整,你可以使(代碼爲std::cout)的代碼適用於文件 - 通過將std::ostream &而不是文件名傳遞給該函數,並將其留給調用者是否使用std::cout調用writer()或開口outputpath

void writer(char character, int count, std::ostream & out) 
{ 
    switch(count) 
    { 
     case 1: 
     { 
      out << character; 
      break; 
     } 
     case 2: 
     { 
      out << character << character; 
      break; 
     } 
     default: 
     { 
      out << character; 
      auto output = conversion(count); 
      for (auto i: *output) 
      { 
       out << i; 
      } 
     } 
    } 
} 

呼喚std::cout輸出:

writer(character, count, std::cout); 

呼喚文件輸出:

std::ofstream file(outputpath, std::ios::binary); 
// ... 
writer(character, count, file); 
+0

非常感謝,我一直在困惑它的字符或字節 – killingtime1

+0

@ killingtime1:在目前可能使用的任何機器上,字符==字節。 sizeof char'被指定爲1,大多數現代體系結構中的CHAR_BIT是8。你在這裏混淆了字符和**位**。 – DevSolar

+0

啊,明白了。非常感謝如何重寫它的例子,我甚至沒有想到這樣做。 – killingtime1