C++ 为什么这个数据流以字节26结尾?

C++ 为什么这个数据流以字节26结尾?,c++,vector,fstream,C++,Vector,Fstream,我仍在处理一周前的位图I/O问题。我又被卡住了,所以我决定从我熟悉的一种I/O开始,让它更像我所需要的(一次检查每个字节(像素),并根据该字节的值输出到文件) 我从一个程序开始,该程序读取并检查文本文件的每个字符,如果高于某个阈值,则输出“Z”,如果低于某个阈值,则输出“a” 那个程序运行得很好,所以我决定将它从文件中的字符改为字节 现在,我一直有问题。文件的前26个字节(0-25个字节)是正确的,但其余的是0或-1,这取决于我是使用ifstream.get()还是ifstream.read 输

我仍在处理一周前的位图I/O问题。我又被卡住了,所以我决定从我熟悉的一种I/O开始,让它更像我所需要的(一次检查每个字节(像素),并根据该字节的值输出到文件)

我从一个程序开始,该程序读取并检查文本文件的每个字符,如果高于某个阈值,则输出“Z”,如果低于某个阈值,则输出“a”

那个程序运行得很好,所以我决定将它从文件中的字符改为字节

现在,我一直有问题。文件的前26个字节(0-25个字节)是正确的,但其余的是0或-1,这取决于我是使用
ifstream.get()
还是
ifstream.read

输入文件
input.file
是在十六进制编辑器中生成的,只包含
0x00-0xFF
。长度为256字节

代码:

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main()
{
   ifstream sourcefile;
   ofstream output;
   ofstream output2;

   output.open("output.txt");
   output2.open("messages.txt");
   sourcefile.open("Input.FILE");

   vector<char> data(256);
   sourcefile.read(&data[0],256);
   sourcefile.seekg(0,ios::beg);

   for(int i = (int) 0x00 ; i < data.size() ; i++)
   {
      output2 << "Value data[" << i << "] = " << (int) data[i] << endl;

      if((int)data[i] < 0)
      {
         // since I can't make an unsigned char vector, I use this to convert
         // it to the correct number. Could this be the problem?
         data[i] = 256 + data[i];
         output2 << "less than zero." << endl;
      }

      if(data[i] > 64)
      {
         data[i] = 0xFF;
         output2 << "greater than 64, set to 0xFF." << endl;
      }
      else if(data[i] < 64)
      {
         data[i] = 0x00;
         output2 << "less than 64, set to 0x00." << endl;
      }
      else
      {
         // This is most likely pointless, but I didn't want to take a chance
         data[i] = 0x75;
         output2 << "neither greater nor less than 64? Set to 0x75." << endl;
      }

      output2 << endl;
   }

   output.write(&data[0],256);
}
#包括
#包括
#包括
使用名称空间std;
int main()
{
ifstream源文件;
流量输出;
流输出2;
output.open(“output.txt”);
output2.open(“messages.txt”);
打开(“Input.FILE”);
矢量数据(256);
读取(&data[0],256);
seekg(0,ios::beg);
对于(int i=(int)0x00;i输出2以二进制模式打开流:

sourcefile.open("Input.FILE", ios::binary);
请尝试
sourcefile.open(“Input.FILE”,std::ifstream::binary)

也许您1)使用的是一个古老的操作系统(如CP/M或DOS),其中一个内嵌控件-Z表示EOF,2)没有以二进制模式打开文件

尝试
sourcefile.open(“Input.FILE”,ios::binary);

如果您查找您将看到的内容,它意味着
媒体结束
,因此,如果您以ascii模式读取,则很有可能后续的任何读取都无法工作

尝试指定您使用的是二进制文件:

sourcefile.open("Input.FILE", ios::binary);

您可以使用Iostream库的错误标志来查找出现错误的确切时间点。这是一个好建议,但错误标志对我没有多大帮助。效果很好!但这有什么关系呢?这只是十六进制数据。十六进制数据在解释为文本数据时,可能会因为错误而过早结束d-Of-File(EOF)终止字符。当流以二进制形式打开时,文件将被完全读取。我忘记了EOF字符。因为您似乎首先回答了第二个问题,所以我将给您最好的答案。@jaffe:这与ASCII无关。您在Windows中遇到的是C/C++“文本模式”,其中^Z(Ctrl Z,ASCII 26)标记文本文件中数据的结尾。我记得这是由CP/M中的类似行为引起的,可能具有不同的控制字符。您可以在命令解释器中通过“type con”等命令测试该行为在任何控制台窗口中,F6函数键上也有Ctrl Z。我以前在控制台中按过Ctrl+Z,以为它会撤消,但我得到了^Z字符。现在我知道这是什么了,谢谢。如果我没记错的话,linux中也有这种行为。