C++中用IO流如何读取存放在 txt 文本中的内容

C++中用IO流如何读取存放在 txt 文本中的内容,第1张

看书

书上讲的很清楚,

遇到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分配的指针与你上次写在文件里的指针不同了,所以显示出的字符串是乱码

首先给你解释原因

记事本的默认编码格式是ANSI,所以你用UTF8读取记事本文件的中文会乱码,

解决方法有两种:

一是用StreamRead去读,new的时候传出两个参数,第一个是路径

第二个是编码格式,你可以指定为枚举类型中的默认编码格式

StreamReader

sr=

new

StreamReader(filename,Encoding.Default)

二是先指定编码格式,然后用指定的编码格式去读取.

代码:

private

static

StringBuilder

readFile(string

filename)//读文件

{

StringBuilder

sb

=

new

StringBuilder()

System.Text.Encoding

encode

=

System.Text.Encoding.GetEncoding("GB2312")

FileStream

fs

=

null

try

{

fs

=

File.OpenRead(@filename)

}

catch

{

return

null

}

byte[]

arr

=

new

byte[5000]

//

UTF8Encoding

data

=

new

UTF8Encoding()

try

{

while

(fs.Read(arr,

0,

arr.Length)

>

0)

{

sb.Append(encode.GetString(arr))

}

return

sb

}

catch

{

return

null

}

finally

{

fs.Close()

}

}

// Test.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include <iostream>

#include <fstream>

using namespace std

void inFile()

ifstream infile

ofstream outfile

char name[30],a,str[1024]

float b

int _tmain(int argc, _TCHAR* argv[])

{

cout<<"请你选择要进行的 *** 作:"<<endl

cout<<"1读取文件!"<<" "<<"2创建和写入文件!"<<" "<<"3删除文件!"<<endl

cin>>b

if (b==1.0f)

{

inFile()

if (!infile)

{

cout<<"未找到名称为 "<<name<<" 的文件!!"<<endl

inFile()

}else

{

cout<<"成功找到文件<<"<<name<<">>内容如下:"<<endl

}

while (infile.get(a))

{

cout<<a

}

cout<<endl

infile.close()

}else if (b==2.0f)

{

cout<<"请输入要写入文件的文件名:"<<endl

cin>>name

outfile.open(name)

if (!outfile)

{

cout<<"没找到<<"<<name<<">>"<<endl

exit(1)

}

cout<<"成功创建<<"<<name<<">>"<<"请输入要写入的内容:"<<endl

cin>>str

outfile<<str

outfile.close()

}

else if (b==3.0f)

{

cout<<"请输入要删除的文件名:"<<endl

cin>>name

if (!remove(name))

{

cout<<"文件"<<name<<"以删除"<<endl

}

else

{

cout<<"文件"<<name<<"删除失败!"<<endl

}

}else

{

cout<<"程序即将退出!下次开启时请按下1,2,3进行选择!!!"<<endl

}

return 0

}

void inFile()

{

cout<<"请输入要读取的文件名:"<<endl

cin>>name

infile.open(name)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11881341.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存