在C / C ++

时间:2017-02-07 04:38:14

标签: c++ arrays printf fwrite

这是一个经常出现的问题,但我找不到合适的答案。

我有一个包含HEX值的char数组。我需要在文本文件中编写这个数组"作为字符串"。

我对HEX没有存储在文件中的看法(看起来垃圾数据)存在缺陷。在十六进制编辑器中,我可以看到数据。

My Hex数组实际上是整数数组而不是字符。我需要考虑这一点。

我试过了:

   FILE * out = fopen(out_file_name, "w");
   char *in = (char*)malloc(sizeof(char) * num_encryption * 16);
   ....
   fwrite(in, sizeof(char), num_encryption*16 + 1, out);

我也尝试了stream,但它再次在文本文件中打印垃圾。

in数组包含如下所示的HEX字符串:21c169ea622e7d52ecd35423f4c3c9f4,总共有32行(num_encryption=32)。

我也试过这样的事情:

std::ofstream outfile(argv[21]);
if(outtfile.is_open()){
  //outtfile.write(wo, sizeof(char)*(num_encryption*16+1));
  for(int k = 0; k < num_encryption; k++){
      for(int j = 0; j < 16; ++j){
         outfile << static_cast<unsigned char>(wo[j + k*16] & 0xff);
      }
   outtfile << std::endl;
  }
}

即使是评论的部分也无法正常工作。 有什么建议吗?

解决方案

我只是将输出(很好)重定向到文件:

FILE * out = fopen(out_file_name, "w");
for(int k = 0; k < num_encryption; k++){
    for(int j = 0; j < 16; ++j){
       fprintf(outfile, "%02x", wo[j + k*16] & 0xff);
       }
    fprintf(outfile, "\n");
 }
fclose(outfile);

我不确定这是否是最优雅的解决方案,但它对我有用。如果您对此有任何了解,请在此处添加。

1 个答案:

答案 0 :(得分:1)

如果问题也与C ++有关,那么让我就如何使用C ++取代的功能给出建议。您正在使用C风格的功能。

你应该使用iostreams。避免使用malloc,使用new,但更好的是直接使用vector<char>unique_ptr<char[]>。在这种情况下,我将使用unique_ptr<char[]>,因为它似乎不需要调整数组的大小。我假设你想在下面写一个二进制文件。

//I assume you want a binary file
std::ostream file("myfile.txt", std::ios::binary);

std::unique_ptr<char []> in = std::unique_ptr<char []>(new char[num_encryption * 16]);
if (file)
   file.write(in.get(), sizeof(char) * num_encryption * 16);

如果您想要以十六进制格式写入文本数据,请以文本模式打开文件:

std::ostream file("myfile.txt"); //Note, no std::ios::binary
...
file >> std::hex >> std::noshowbase; //Write in hex with no base
std::copy(in.get(),
          in.get() + num_encryption * 16,
          std::ostream_iterator<char>(file)); //Write one char at a time, in hex, with no base

警告:未经测试,只显示了如何编写二进制或格式化十六进制文本的想法,char为char。