我是处理文件的初学者。我想在我的代码中做的是从用户那里获取一个名字,并将其隐藏在.bmp图片中。并且还能够从文件中再次获取名称。但我想先将字符更改为ASCII码(这就是我的作业所说的)
我尝试做的是将名称的字符更改为ASCII码,然后将它们添加到bmp图片的末尾,我将以二进制模式打开它。在添加它们之后,我想从文件中读取它们并能够再次获得该名称。
这是我到目前为止所做的。但我得不到合适的结果。我得到的只是一些毫无意义的人物。这段代码是对的吗?
int main()
{
cout<<"Enter your name"<< endl;
char * Text= new char [20];
cin>> Text; // getting the name
int size=0;
int i=0;
while( Text[i] !='\0')
{
size++;
i++;
}
int * BText= new int [size];
for(int i=0; i<size; i++)
{
BText[i]= (int) Text[i]; // having the ASCII codes of the characters.
}
fstream MyFile;
MyFile.open("Picture.bmp, ios::in | ios::binary |ios::app");
MyFile.seekg (0, ios::end);
ifstream::pos_type End = MyFile.tellg(); //End shows the end of the file before adding anything
// adding each of the ASCII codes to the end of the file.
int j=0;
while(j<size)
{
MyFile.write(reinterpret_cast <const char *>(&BText[j]), sizeof BText[j]);
j++;
}
MyFile.close();
char * Text2= new char[size*8];
MyFile.open("Picture.bmp, ios:: in , ios:: binary");
// putting the pointer to the place where the main file ended and start reading from there.
MyFile.seekg(End);
MyFile.read(Text2,size*8);
cout<<Text2<<endl;
MyFile.close();
system("pause");
return 0;
}
答案 0 :(得分:5)
您的代码中存在许多缺陷,其中一个重要原因是:
MyFile.open("Picture.bmp, ios::in | ios::binary |ios::app");
必须
MyFile.open("Picture.bmp", ios::in | ios::binary |ios::app);
^ ^
| |
+-----------+
其次,使用std::string
而不是C风格的字符串:
char * Text= new char [20];
应该是
std::string Text;
另外,使用std::vector
制作数组:
int * BText= new int [size];
应该是
std::vector<int> BText(size);
依此类推......
答案 1 :(得分:1)
你写int
(32位)但是读char
(8位)。
为什么不按原样写字符串?没有必要将其转换为整数数组。
而且,你不会终止你读到的数组。
答案 2 :(得分:0)
您的写入操作不正确,您应该直接传递完整的文本
MyFile.write(reinterpret_cast <const char *>(BText), sizeof (*BText));
此外,将字符串转换为整数并返回字符会在字符之间插入空格,而这些空格在阅读操作中未考虑