C++将字符数组按空格分割到类的js 对象数组组中并输出,求教

关于字符串流的学习(c++) - 1.曲待续 - 博客园
随笔 - 309, 文章 - 0, 评论 - 3, 引用 - 0
/* 字符串流
在字符数组中可以存放字符,也可以存放整数、浮点数以及其他类型的数据。在向字符数组存入数据之前,要先将数据从二进制形式转换为ASCII代码,然后存放在缓冲区,再从缓冲区送到字符数组。从字符数组读数据时,先将字符数组中的数据送到缓冲区,在赋给变量前要先将ASCII代码转换为二进制形式。总之,流缓冲区中的数据格式与字符数组相同。
文件流类有ifstream,ofstream和fstream,而字符串流类有istrstream,ostrstream和strstream。文件流类和字符串流类都是ostream,istream和iostream类的派生类,因此对它们的操作方法是基本相同的。向内存中的一个字符数组写数据就如同向文件写数据一样,但有点不同:
(1) 输出时数据不是流向外存文件,而是流向内存中的一个存储空间。输入时从内存中的存储空间读取数据。
(2) 字符串流对象关联的不是文件,而是内存中的一个字符数组,因此不需要打开和关闭文件。
(3) 每个文件的最后都有一个文件结束符,表示文件的结束。而字符串流所关联的字符数组中没有相应的结束标志,用户要指定一个特殊字符作为结束符,在向字符数组写入全部数据后要写入此字符。
字符串流类没有open成员函数,因此要在建立字符串流对象时通过给定参数来确立字符串流与字符数组的关联。即通过调用构造函数来解决此问题。建立字符串流对象的方法与含义如下:
1. 建立输出字符串流对象
ostrstream类提供的构造函数的原型为
ostrstream::ostrstream(char *buffer,int n,int mode=ios::out);
buffer是指向字符数组首元素的指针,n为指定的流缓冲区的大小(一般选与字符数组的大小相同,也可以不同),第个参数是可选的,默认为ios::out方式。可以用以下语句建立输出字符串流对象并与字符数组建立关联:
ostrstream strout(ch1,20);
作用是建立输出字符串流对象strout,并使strout与字符数组ch1关联(通过字符串流将数据输出到字符数组ch1),流缓冲区大小为。
2. 建立输入字符串流对象
istrstream类提供了两个带参的构造函数,原型为
istrstream::istrstream(char *buffer);
istrstream::istrstream(char *buffer,int n);
buffer是指向字符数组首元素的指针,用它来初始化流对象(使流对象与字符数组建立关联)。可以用以下语句建立输入字符串流对象:
istrstream strin(ch2);
作用是建立输入字符串流对象strin,将字符数组ch2中的全部数据作为输入字符串流的内容。
istrstream strin(ch2,20);
流缓冲区大小为,因此只将字符数组ch2中的前个字符作为输入字符串流的内容。
3. 建立输入输出字符串流对象
strstream类提供的构造函数的原型为
strstream::strstream(char *buffer,int n,int mode);
可以用以下语句建立输入输出字符串流对象:
strstream strio(ch3,sizeof(ch3),ios::in|ios::out);
作用是建立输入输出字符串流对象,以字符数组ch3为输入输出对象,流缓冲区大小与数组ch3相同。
以上个字符串流类是在头文件strstream中定义的,因此程序中在用到istrstream, ostrstream和strstream类时应包含头文件strstream(在GCC中,用头文件strstream)。6398人阅读
&&&&&这次读取的就是上一篇中的original文件的每一行到一个整数数组中。
&&&& 使用getline(缺省吧回车符endl作为行标记)分别把每一行读入到一个字符串数组,在这个字符数字最后加上/0构成一个字符串;
&&&& 使用strtok函数把每行组成的字符串以空格为标记划分多个单元返回为一个char*类型值pchTok;
&&&& 然后把pchTok使用atoi转化为int类型每个存入到一个整型数组的每个单元中sortArray[i]中;
&&&& 之后把数组使用堆排序算法排序后按照对齐格式输出到另外一个文本中。void heapSort_Write()中。
&&&& 为了使用字符串函数要包含string.h;为了使用setw要包含iomanip.h。
#include "heapSort.h"#include &iostream&#include &string&#include &fstream&#include &iomanip&
#define& ARRAY_SIZE&1000int heapcount = 0;//记录总共的比较次数
void FixHeap(int L[], int Hsize, int root, int k){&//int larger = 0;&if((2 * (root + 1)) & Hsize)//叶子节点&&L[root] =&else{&&int larger = 0;&&if((2*(root + 1)) == Hsize)//只有左子树&&&larger = 2 * root + 1;&&else if(L[2 * root + 1] & L[2 * (root + 1)])//有左右子树&&&larger = 2 * root + 1;&&else &&&larger = 2 * (root + 1);&&if(k & L[larger]) &&{&&&heapcount++;&&&L[root] =&&}&&else{&&&heapcount++;&&&L[root] = L[larger];&&&FixHeap(L, Hsize, larger, k);&&}&}&}
void BuildHeap(int L[], int n){&for(int i = n/2 - 1; i &= 0; i--)// 从第n/2-1个节点开始向上建堆&&FixHeap(L, n, i, L[i]);&}
void HeapSort(int L[], int n ){&BuildHeap(L, n);&for(int i = n -1; i &= 0; i-- ){&&int temp = L[i];&&L[i] = L[0];&&FixHeap(L, i , 0, temp);&} &}
void HeapSort_Write(){
&int sortArray[15];//存储每行读入的数据,用于排序算法的调用
&string strL&char achLine[ARRAY_SIZE];&const char* pchT
&ifstream in_file("original.txt", ios::in);&ofstream out_file("heapResult.txt");&&int precount = 0;//用于和thiscount作差来计算每次排序所需要比较的次数&int num = 0;//用来记录是第几行的排序结果
&while(in_file.good()){&&num++;&&//每次读一行并且拷贝到achLine中构成一个数组&&getline(in_file, strLine);&&strLine.copy(achLine, strLine.size(), 0);&&achLine[strLine.size()] = '/0';
&&//每行中的元素以空格为标识断开转换为int类型后存入数组&&pchTok = strtok(achLine, " ");&&int i = 0;&&while((pchTok != NULL)){&&&sortArray[i] = atoi(pchTok);&&&i++;&&&//cout && atoi(pchTok) && " ";&&&pchTok = strtok(NULL, " ");&&}
&&//使用堆排序算法并将结果,第几行的比较结果以及这一行排序所用的比较次数写入到heapResult.txt文件&&HeapSort(sortArray, 15);
&&for(int j = 0; j & 15; j++){&&&//setw的使用方法&&&out_file && setw(3) && setiosflags(ios::right)&& sortArray[j]& ;//数组中的每个数都在一个3字符的宽的空间右对齐输出&&}
&&int thiscount =&&out_file && "第" && setw(4) && num && "行总共比较了" && setw(4) && thiscount - precount && "次" &&"排序结果是:" && "&& ";&&precount =
&&&&out_file &&&}&//cout &&&out_file.close();&in_file.close();}
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:434875次
积分:6626
积分:6626
排名:第1066名
原创:231篇
转载:103篇
评论:54条
(4)(5)(1)(2)(59)(40)(21)(22)(32)(36)(35)(26)(9)(1)(15)(1)(13)(12)C++中如何把一个字符串分割并放进一个数组(不限字符数,包括空格)_百度知道
C++中如何把一个字符串分割并放进一个数组(不限字符数,包括空格)
另外,为什么char *p=a;查看答案这样不合理?为什么把a的地址赋给指针p不行?a的地址也是string所以不行吗?
提问者采纳
#include &string&#include &string.h&这两条预处理指令分别引入的是string类和C语言的对字符数组的函数方法,所以是不能混用的。char* p是一个字符指针等同于一个字符数组,而string是一个类,一种自定义类型,所以直接这么赋值是不正确的。而你说的const char *类型的值不能用来初始化char *类型的实体,const char* 是指向的空间内容不可变,而指针的地址可变,如果你用它来初始化一个char指针,假设允许的话,两个指针就指向的空间是同一个,而前者要求这个空间的内容不可变,后者允许这个空间可变,显然就会出现冲突,所以是不行的
提问者评价
其他类似问题
按默认排序
其他1条回答
string a的话,没有'\0'结束标记;要使用C风格的字符串,正确的转换方法是:char* p = a.c_str();
const char *类型的值不能用来初始化char *类型的实体
如果你不需要改变那个字符串的内容,就定义成 const char*吧。。。想得到char*类型的话,就只能显示的类型转化了.char* p = (char*)a.c_str();
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 对象数组 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信