C++中用IO流如何读取存放在 txt 文本中的内容 5
2个回答
展开全部
看书
书上讲的很清楚,
遇到string的时候再看这段代码。
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
string str1;
string str2;
cin >> str1;
cin >> str2;
ofstream outfile("temp.dat",ios::binary);
if(! outfile)
{
cerr << "Error ! " <<endl;
return 0;
}
outfile.write((char * )&str1,sizeof(string));
outfile.write((char * )&str2,sizeof(string));
outfile.close();
ifstream infile("temp.dat",ios::binary);
if (! infile)
{
cerr << "Error ! " <<endl;
return 0;
}
infile.read((char * )&str1,sizeof(string));
infile.read((char * )&str2,sizeof(string));
cout <<str1 <<endl;
cout <<str2 <<endl;
return 1;
}
如果我就这样执行的话,str1和str2能保存到文件,而且能够成功读取并显示。
但如果我把“保存”的那一段代码删掉,读取就会失败,显示乱码。怎么回事?怎么解决?(不要复制一大堆东西过来,谢谢。)
提问者: darksun113 - 试用期 一级 最佳答案
你保存的时候应该这样保存:
int main()
{
string str1;
string str2;
cin >> str1;
cin >> str2;
ofstream outfile("temp.dat",ios::binary);
if(! outfile)
{
cerr << "Error ! " <<endl;
return 0;
}
outfile.write(str1.c_str(),str1.size()+1);
/*你原来写成(char * )&str1,这样往文件里写入的东西其实是str1这个类的数据(包括了指向实际字符串的指针),而不是字符串。因为string类的字符串是用new在堆上分配的,string类本身只包含字符串的指针,用c_str()这个成员函数可以获得这个指针,你可以看一下string类的源码。
改成这样以后,写入文件里的就是实际的字符串了。
写入的长度应该是字符串的长度(包括结束符'\0')*/
outfile.write(str2.c_str(),str2.size()+1);
outfile.close();
return 1;
}
读取的时候这样读取:
int main()
{
string str1;
str1.reserve(100);/*为str1申请100个字符的空间,如果不申请的话c_str()返回的是空指针,也就是没有空间。假设你上次存的两个字符串长度不超过100。*/
ifstream infile("temp.dat",ios::binary);
if (! infile)
{
cerr << "Error ! " <<endl;
return 0;
}
infile.read((char * )str1.c_str(),100);/*这儿由于不知道你上次写入文件的两个字符串的长度,只能把文件里的内容都读出来再根据'\0'来分析出两个字符串。*/
cout <<str1 <<endl; //输出第一个字符串
cout << (char*)(str1.c_str() + strlen(str1.c_str())+1) << endl;//输出第二个字符串
return 1;
}
至于原来你写的程序能够正常工作,是因为你往文件里写的是string类,包含了字符串指针,而同一个进程里面指针是不会变的,所以你读出来之后OK。
当你把“保存”的那一段代码删掉后,你再编译运行这个程序,这时str1/str2分配的指针与你上次写在文件里的指针不同了,所以显示出的字符串是乱码
书上讲的很清楚,
遇到string的时候再看这段代码。
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
string str1;
string str2;
cin >> str1;
cin >> str2;
ofstream outfile("temp.dat",ios::binary);
if(! outfile)
{
cerr << "Error ! " <<endl;
return 0;
}
outfile.write((char * )&str1,sizeof(string));
outfile.write((char * )&str2,sizeof(string));
outfile.close();
ifstream infile("temp.dat",ios::binary);
if (! infile)
{
cerr << "Error ! " <<endl;
return 0;
}
infile.read((char * )&str1,sizeof(string));
infile.read((char * )&str2,sizeof(string));
cout <<str1 <<endl;
cout <<str2 <<endl;
return 1;
}
如果我就这样执行的话,str1和str2能保存到文件,而且能够成功读取并显示。
但如果我把“保存”的那一段代码删掉,读取就会失败,显示乱码。怎么回事?怎么解决?(不要复制一大堆东西过来,谢谢。)
提问者: darksun113 - 试用期 一级 最佳答案
你保存的时候应该这样保存:
int main()
{
string str1;
string str2;
cin >> str1;
cin >> str2;
ofstream outfile("temp.dat",ios::binary);
if(! outfile)
{
cerr << "Error ! " <<endl;
return 0;
}
outfile.write(str1.c_str(),str1.size()+1);
/*你原来写成(char * )&str1,这样往文件里写入的东西其实是str1这个类的数据(包括了指向实际字符串的指针),而不是字符串。因为string类的字符串是用new在堆上分配的,string类本身只包含字符串的指针,用c_str()这个成员函数可以获得这个指针,你可以看一下string类的源码。
改成这样以后,写入文件里的就是实际的字符串了。
写入的长度应该是字符串的长度(包括结束符'\0')*/
outfile.write(str2.c_str(),str2.size()+1);
outfile.close();
return 1;
}
读取的时候这样读取:
int main()
{
string str1;
str1.reserve(100);/*为str1申请100个字符的空间,如果不申请的话c_str()返回的是空指针,也就是没有空间。假设你上次存的两个字符串长度不超过100。*/
ifstream infile("temp.dat",ios::binary);
if (! infile)
{
cerr << "Error ! " <<endl;
return 0;
}
infile.read((char * )str1.c_str(),100);/*这儿由于不知道你上次写入文件的两个字符串的长度,只能把文件里的内容都读出来再根据'\0'来分析出两个字符串。*/
cout <<str1 <<endl; //输出第一个字符串
cout << (char*)(str1.c_str() + strlen(str1.c_str())+1) << endl;//输出第二个字符串
return 1;
}
至于原来你写的程序能够正常工作,是因为你往文件里写的是string类,包含了字符串指针,而同一个进程里面指针是不会变的,所以你读出来之后OK。
当你把“保存”的那一段代码删掉后,你再编译运行这个程序,这时str1/str2分配的指针与你上次写在文件里的指针不同了,所以显示出的字符串是乱码
2009-07-07
展开全部
额...简单点说,声明输入流变量,使用open函数将其链接到文件,程序就可以使用提取符从文件中获取输入了......
PS建议在电脑网络类中重新提问。
PS建议在电脑网络类中重新提问。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询