关于字读取
现需要读取一个标签对内中的数据。比如:<C++> int float double char bool</C++> 使用接口的声明如下: int readKeyword(string strLabel, string &strReturn); 参数说明: strLabel为标签对,如上面的“C++” strReturn为存放去读后的字符串。以一个空格为间隔。 如,上面读取后,存放格式为:“int float double char bool” 返回值为int类型。返回0表示没有错误。 返回1表示标签对没有找到。 返回2表示标签对找到,但没有找到结束的标签对( </C++> )。此时strReturn扔存放标签开始处到返回前找到的所有值。 返回3表示其他类型错误。 定义类名称为:IOKeyword 类中其他必要参数:string strFile:存放需要读取的文件路径。使用类前。可以初始化这个路径。也可以重新设置这个文件名。没弄到我所需要的功能,求改写!
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class lOKeyword
{
private:
string strLabel; //存放标签
string *strReturn; //存放要输出的字符串
ifstream read;//文件
string temp;
public:
lOKeyword();//打开文件
~lOKeyword();//关闭文件
int readKeyword(string strLabel, string &strReturn); //文件操作
bool OutPut();
};
lOKeyword::lOKeyword()
{
read.open("1.txt", ios::in);
}
lOKeyword::~lOKeyword()
{
read.close();
}
int lOKeyword::readKeyword(string strLabel, string &strReturn)
{
getline(read, strReturn);
if(strReturn != "<" + strLabel + ">")
{
return 1;
}
if(strReturn != "<"+ strLabel +">" + "</" + strLabel + ">")
{
return 2;
}
this->strLabel = strLabel;
this->strReturn = &strReturn;
return 0;
}
bool lOKeyword::OutPut()
{
cout << *strReturn << endl;
return true;
}
int main()
{
lOKeyword one;
string temp_1, *temp_2;
cout << "请输入标签名: ";
cin >> temp_1;
int num;
num = one.readKeyword(temp_1, *temp_2);
if(1 == num)
{
cerr << "标签没有找到"<< endl;
return -1;
}
if(2 == num)
{
cerr << "没有找到尾标签" << endl;
return -1;
}
one.OutPut();
return 0;
}
几个错误:
1. 成员指针strReturn没有初始化 且正确的命名应是m_strReturn ,在构造函数中m_strReturn=NULL
2.main中,传入的引用指针值的引用,这个指针 temp_2也没有初始化 , *temp_2取到的地址将是一个不可预知的值
3.int lOKeyword::readKeyword(string strLabel, string &strReturn)这个函数,我想你是要一次读取一个标签对的内容,可能有多个标签对吧,一个标签对也不一定是在同一行中,那么你只getline一次肯定是不行的。
3.后续判断的问题,你不能保证你读到的前几个字符,就一定是<strLabel> 或者</strLabel>,所以应该用find,先找到<strLabel>,然后再找</strLabel>,取<strLabel>和</strLabel>中间的内容就是你要的,当然,还可考虑你的文件格式有没有嵌套的比如
<strLable>
<strLabel1></strLabel1>
<strLabel2>
<strLabel1></strLabel1>
</strLabel2>
</strLabel>
再说,你的判断条件,strRetun既要等于<strLabel> 又要等于</strLabel>?
路过帮顶 路过帮顶 e ,这个有点复杂,你一步步看吧,用编译器。不太好说 string 没用过 用得char*
还有ofstream不需要是成员变量吧
要是成员变量也应该是 ofstream的指针
char lpTemp;
while (!read->eof())
{
read->getline((char*)lpTemp, 255);
cout << lpTemp<< endl;
}
可以构造时就打开文件 也可以第一次调用读时打开文件 保证一个对象只有一个ifstream实例即可
:lol ,写了一堆,就不粘代码了,给分就行:P
擦,要隔60秒才能找你要分。。。:P
很不错呀,多谢分享!
页:
[1]