一个类里有string类型数据是不是不能用ofstream写入文件

作者&投稿:巩很 (若有异议请与网页底部的电邮联系)
一个类里有string类型数据,是不是不能用ofwrite写入文件??~

http://bbs.csdn.net/topics/20308141
其实我想string是不安全的
不删除pA正确的原因是:即使你新new出来的A指针仍然分配的是原来单元的内容,因为你可以在调试的时候跟踪,str确实是先前pA的地址,所以起内容显示的仍然是pA 的内容,而真正意义上的p的str没有被赋值,如果不相信,你可以试一试将pA delete之后再设为NULL,然后再new一次,你这个时候得到的p的str是空值。
我想最主要的原因是string 是一个对象,他的赋值和地址分配是和字符串是不同的,因为他的所有信息不一定一次性给出。在fread的时候你试图让p的内存直接覆盖为文件中的内容,这样是不可能将string正确复制的。具体的原因和string的实现有关系。

其实我以前已经犯过这个问题,试图将一块包含string或其他stl的内存从windows发送到unix下,然后完成数据的接收,结果得到的string 是不正确的。

你保存的时候应该这样保存:
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对象不能简单的通过io写入文件,因为这个对象是通过指针实现的,你写入文件的将会是一个内存地址,无法直接保存字符串内容。
解决办法:要么不使用string对象,而是char/wchar数组保存字符串;要么,自己写一个类的IO函数(方法),在方法中获取string内容到一个字符串指针或数组,再写入文件。


请问java中的String类和StringBuffer类有什么区别与联系,谢!
在java中有3个类来负责字符的操作。1.Character 是进行单个字符操作的,2.String 对一串字符进行操作。不可变类。3.StringBuffer 也是对一串字符进行操作,但是可变类。String:是对象不是原始类型.为不可变对象,一旦被创建,就不能修改它的值.对于已经存在的String对象的修改都是重新创建一个新的对象,...

JDK的java.lang包里有String类,short类,long类int类呢?在哪个包里?
short、long、int等等小写字母开头的不是类,是基本类型。但是他们分别有对应的类,比如:int对应Integer,long对应Long,boolean--Boolean ,byte--Byte ,char--Character ,double--Double ,fload--Float 等等,都在lang包里,自己下个API看看 。基本类型和相应的类,在JDK1.5之前需要通过方法相互...

String和String的区别
”kvill”的一个引用。所以我们得出s0==s1==s2;用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。看例2:String s0=”kvill”;String s1=new String(”kvill”);String s2=”kv” + new String(“ill”);S...

编写一个类Stock表示股票,成员变量有: string型symbol,表示股票代码...
public static void main(String[] args){ Stock stock = new Stock("IBM", "Intermational Business Manufacture Inc",176 , 153);System.out.println(stock.name+"股票本月同比上月上涨"+stock.changePercent()+"个百分点!");} 我也是学生啊 可以进行技术交流哦 希望这能帮助到你......

C#string 到底是引用类型还是值类型
一旦创建了一个string,在managed heap 上为他分配了一块连续的内存空间,我们将不能以任何方式对这个string进行修改使之变长、变短、改变格式。所有对这个string进行各项操作(比如调用ToUpper获得大写格式的string)而返回的string,实际上另一个重新创建的string,其本身并不会产生任何变化。如满意,请采纳...

String类和StringBuffer类的区别
所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。但是有一个最显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和...

String类的包名是什么?
包名为: java.lang。备注:String类型是java的基本类型,并且是不需要再编写的类中引入到类中的,如果引入会直接报错,所以在开发过程中直接引用String即可。

...姓名、成绩,学号用整型,成绩用浮点型,姓名用string类
public class Students{ private int s_number;\/\/学员学号 private string s_name;\/\/学号姓名 private float s_result;\/\/学号成绩 }

pascal 里面数组类型 string[2] 这个[2]是什么意思?
string[2] 这个[2] 是指定义字符串的长度为两个字节。

java有多少个类,常用的类有哪些?有求高手指点,刚学什么都不太懂,谢谢...
String 字符串类 System 可得到系统信息 StringBuilder 字符串工具类 Thread 线程类 Math 与数学有关的工具类 ArrayList 底层用数组实现的集合 LinkedList 底层用链表实现的集合 HashMap 接口Map的一个实现类 HashSet 接口Set的一个实现类 Scanner 简单文本扫描器 Calendar 日期类 Date 日期类 File 目录或...

独山子区17723637404: 一个类里有string类型数据是不是不能用ofstream写入文件 -
镇昂乌灵: 是的.string对象不能简单的通过io写入文件,因为这个对象是通过指针实现的,你写入文件的将会是一个内存地址,无法直接保存字符串内容.解决办法:要么不使用string对象,而是char/wchar数组保存字符串;要么,自己写一个类的IO函数(方法),在方法中获取string内容到一个字符串指针或数组,再写入文件.

独山子区17723637404: String是不是Java中的基本数据类型? -
镇昂乌灵: 不是.基本数据类型就只有八个,数值型:byte,short,int,long,浮点型:float,double,字符型:char,布尔型:boolean.

独山子区17723637404: JAVA中String是一个类还是一种基本类型? -
镇昂乌灵: String 是一个字符串类 类的定义方法:String str = new String ("hello"); 只不过它也可以: String str = "hello"; 基本类型就8个 byte、 short、 int、 lang float、 double boolean char

独山子区17723637404: JAVA的数据类型的4类8种为什么不包括String呢? -
镇昂乌灵: Java的数据类型分两种:1.基本类型:int,byte,float,double,char2. 对象类型(类): Integer,Byte,Float,Double,Char,String,其它一切java提供的,或者你自己创建的类.其中Integer又叫 int的包装类.而Byte和Float也类似,一般包装类的名字首写...

独山子区17723637404: string为什么是引用数据类型 -
镇昂乌灵: 简单的说,String是一个类,java里的引用数据类型包括 类,接口,数组 其它区别1. 基本数据类型:变量名指向具体的数值 引用数据类型:变量名指向存数据对象的内存地址,即变量名指向hash值2. 基本数据类型:变量在声明之后java就会立刻分配给他内存空间 引用数据类型:它以特殊的方式(类似C指针)指向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址.3. 基本数据类型:使用时需要赋具体值,判断时使用“==”号 引用数据类型:使用时可以赋null,判断时使用equals方法

独山子区17723637404: String是不基本数据类型?为什么? -
镇昂乌灵: String 在C++里面是模板类, 当然不是基本数据类型拉.至于为什么,理解下把,比如int 编译器直接支持加减乘除之类的造作,这些就是基本的数据类型. String要支持加减乘除必须通过重载运算符来实现才行.这些明显就不是.

独山子区17723637404: string是最基本的数据类型吗 -
镇昂乌灵: string并非c++的最基本数据类型,而是标准库(STL)的字符串处理类.包含字符串处理的一般方法,如字符串比较,相加,查找指定字符串,删除指定字符等等,存储字符串所需要的内存空间由string类管理,用户不需要关心.

独山子区17723637404: java中String是不是基本类型 -
镇昂乌灵: java中的八大基本类型: 字节型(byte),短整型(short),整型(int),长整型(long),字符型(char),浮点型(float),双精度型(double),布尔型(boolean)在java里面除去基本数据类型的其它类型都是引用数据类型,所以String不是基本类型而是引用类型.

独山子区17723637404: String是最基本的数据类型吗 ?
镇昂乌灵: 不是 基本数据类型包括byte、int、char、long、float、double、boolean和short. java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类.为了提高效率节省空间,我们应该用StringBuffer类

独山子区17723637404: C#中的string类和String有何区别? -
镇昂乌灵: 意思都差不多,只是一个是类型,一个是类.用起来差不多,不用考虑.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网