怎么样将unsigned char类型变量存入文件(如TXT文件),在从文件中读入,要求保持原来unsigned char

来源:互联网 发布:手机英文软件翻译器 编辑:程序博客网 时间:2024/05/23 21:55

关于文件的操作可以看博客:http://blog.sina.com.cn/s/blog_661314940100o0ym.html


最近在编密码学上有限域GF(2^8),碰到一个问题:那就是把unsigned char类型的变量怎么存入一个txt文件后,使得再次从文件中读出这些数据时,保持这些值仍不变。

刚开始,我用文件流对象以文本文件的方式代开一个文件。然后用输出操作符“<<”输出unsigne char变量。但是再次用输入操作符“>>”读入这些变量时,得到的值却不是我所期望的值。要知道,我们的ASCII码的8位二进制的最高位为0。如果我把unsigned char类型变量存入文本文件的时候,对于他们高位为1的情况,就有可能在文本文件里被解释为汉字,或者其他什么。再次读入的时候就会出问题。。。。。。由于对文件操作这部分学的不好,这个问题困惑了我一天。然后到网上搜答案,也没有搜到。

和同学讨论这个问题时,他突然说到二进制。我猛然想到,用二进制文件存储unsigned char类型值是可以的!因此,第二天进行了下面的实验。真是感觉书到用时,方恨少!


首先给出c++中输入输出流对象可操作二进制文件的两个函数:

read函数,函数声明:istream &read( char *buffer, streamsize num );     函数read()用于输入流,在将字符放入buffer 之前从流中读取num 个字节。如果碰到EOF,read()中止,丢弃不论多少个字节已经放入。可用于读取结构体数据:

 struct {      int height;      int width;    } rectangle;        input_file.read( (char *)(&rectangle), sizeof(rectangle) );    if( input_file.bad() ) {      cerr << "Error reading data" << endl;      exit( 0 );    }

write函数,函数原型: ostream &write( const char *buffer, streamsize num );   write()函数用于输出流,从buffer中写num个字节到当前输出流中。


下面的代码是我对unsigned char变量存入二进制文件,并从二进制文件中再读取出的实验代码。


#include<iostream>#include<fstream>using namespace std;int main(void){//新建一个文件流对象file,以二进制方式打开文件fir.txt,向这个文件中输入变量fstream file("fir.txt", ofstream::app | ios::binary | ofstream::out);if (!file){cerr << "open fir.txt failure" << endl;return 0;}unsigned char i = 0;//将置为1~255的unsigned char值写入到二进制文件中while ( i != 255){i++;file.write((char *)&i , sizeof(i));}cout << endl;file.close();file.clear();//打开二进制文件,进行读file.open("fir.txt", ifstream::in | ios::binary);if (!file){cerr << "open fir.txt for read failure!" << endl;return 0;}//依次读取二进制文件中的unsigned char值读入到变量i,并输出while (file.read((char *)&i, sizeof(i))){cout << (int)i << "\t";if (i % 10 == 0){cout << endl;}}cout << endl;file.close();file.clear();return 0;}

实验结果:





对结构体的操作:

代码

#include<iostream>#include<fstream>using namespace std;struct Student{int age;char sex;double salary;static int count;Student(int a = 0, int s = 'm', double m = 0.0) : age(count + a), sex(s), salary(m + count){count++;}};int Student::count = 0;int main(void){//新建一个文件流对象file,以二进制方式打开文件sec.txt,向这个文件中输入变量fstream file("sec.txt", ofstream::app | ios::binary | ofstream::out);if (!file){cerr << "open sec.txt failure" << endl;return 0;}Student s[10];for(int i = 0 ; i != 10; i++){cout << "s[" << i << "]'s information :" << endl << s[i].age << "\t" << s[i].sex << "\t" << s[i].salary << endl;}//将数组s中元素写入到二进制文件中for ( int i = 0; i != 10; i++){file.write((char *)&s[i] , sizeof(s[i]));}cout << endl;file.close();file.clear();//打开二进制文件,进行读file.open("sec.txt", ifstream::in | ios::binary);if (!file){cerr << "open sec.txt for read failure!" << endl;return 0;}//依次读取二进制文件中的unsigned char值读入到变量i,并输出Student ss;int i = 0;cout << "*******************************" << endl;cout << "the result reading from sec.txt" << endl;cout << "*******************************" << endl;while (file.read((char *)&ss, sizeof(ss))){cout << "ss[" << i << "]'s information" << endl << ss.age << "\t" << ss.sex << "\t" << ss.salary << endl;i++;}cout << endl;file.close();file.clear();return 0;}


结果:


0 0