2017-03-27 136 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