关于文件的操作可以看博客: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;
}
结果: