今天在写一个测试用例的时候,需要实现如题的功能:
一、用ifstream 和getline 来实现。
<pre name="code" class="html"> string tmpStr("");
string *a = new string[MAX_LINES];
int index = 0;
inFile.open("haha.txt", ios::in);
if (NULL == inFile)
{
cout << "文件打开失败!" << endl;
return ;
}
while (<span style="font-family: Arial, Helvetica, sans-serif;">getline(inFile, tmpStr)</span>)
{
a[index] = tmpStr;
index += 1;
}
for (int j = 0; j < index; j++)
{
cout << a[j] << endl;
}
//string 转换为char
const char *p = a->c_str();
char *pData;
pData=const_cast<char *>(p);
preDealTheUartData_Purifier(( uint8_t *)p,strlen(p));
这段代码有两个问题:
1、
在这段代码中a是string格式的,不方便进行字符处理,所以需要将string转换为char类型,函数原型static void preDealTheUartData_Purifier( uint8_t *data, uint32_t len);
本人一开始就在想着怎样把p的const 属性去掉,网上的一些博客说:不能把一个const变量直接赋给一个非const变量,必须要转换,是不严谨的说法,如果是普通的const变量,只要不修改其值就可以,这边问题的根源是指针的初始化问题:
void funA(int *a);
void funB(const int *b);
int *ia;
const int *ib;
funB(ia); //正确
funB(ib); //正确
funA(ia); //正确
funA(ib); //错误:不可以将非const对象的指针指向const对象,但是可以将const对象的指针指向非const对象
说明:如图
说明:p是一个指向const对象的指针,不能通过p修改其指向对象的值,但是p可以保存const和非const对象的地址,如果p保存的是非const对象的地址,则需要通过新建另外一个非const指针进行过度来修改。而对于q,这类普通的指针,不能将其赋予const对象的地址。(C++primer4 :4.2.5节)
后来我发现data这个数据在程序中本身就没有修改,需要设置为const,同时如果不改变data的const属性,直接使用(unsigned char*)p,类型强制转换,就可以修改p的const属性(环境VC++),而且不会报错,这一点值得商量。
2、
这一段程序是从网上截取的,程序的实际目的是为了获取文本文件中的字符数据进行处理,但是程序
getline(inFile, tmpStr)
中的getline是
从输入流中读入字符,存到string变量,
但这边的tempStr就有问题了,字符串遇到‘\0’就会就会截止输入,二进制文件里只要出现0x00,后面的字符就无法获取了。这里需要注意的是:空字符\0对应的二进制为00000000,而数字0为00110000。百科中的getline定义是:
size_t getline(char **lineptr, size_t *n, FILE *stream);
其实可以试一试这一种函数,比较符合常规,下面来阐述第二种方案。
二、用FILE fopen来实现(自行定义MAX_SIZE)
<span style="white-space:pre"> </span>FILE *fp;
char *ch=new char[MAX_SIZE];
if((fp=fopen("haha.txt","ab+"))==NULL) //ab+以二进制打开,可读写
{
printf("\n不能打开文件!");
return 0;
}
ch[len]=fgetc(fp); //存入数组
while(ch[len]!=EOF) //读到文件末尾
{
if(len<MAX_SIZE)
ch[++len]=fgetc(fp);
else
{
printf("\n输入的数据超过界限!");
return 0;
}
}
可以完美实现