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

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


结果:


  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值