- 论坛徽章:
- 0
|
可以轻松的处理文件的按行读入,和字串分割.
解决window和linux平台下因文件格式不同而导致的错误(EOF, '\r\n' '\n')问题.....
/*
*函数说明: 读入一个有效的行. 处理后这行的最前面和最后面的空白(' ' 和 '\t' 和'\r')都将被过滤掉.
*输入参数: 文件流对象引用,字符串引用
*输出参数: 保存在传入的字符串引用中
*函数返回: false = 读取文件结束....(文件结束概率是99.9%,剩下的出错情况应该和文件结尾一样的处理)
* true = 读到了一个有效的行
*/
bool readline(ifstream& infile, string& textline)
{
while(getline(infile, textline, '\n'))
{
int prev_pos = 0; //最开始有效字符位置.....
int post_pos = 0; //最后有效字符位置....
//下面的循环语句可以用textline.find_first_not_of(filter,pos)来处理,出于效率考虑本处使用这样的算法.........
while(textline[prev_pos] == ' ' || textline[prev_pos] == '\t' || textline[prev_pos] == '\r')//过滤开始空白
prev_pos++;
if(textline[prev_pos] == '\0')
continue;//如果是空白行则再读一行进行处理.......
else
{
post_pos=textline.length()-1;
while(textline[post_pos] == ' ' || textline[post_pos] == '\t' || textline[post_pos] == '\r')//过滤最后的空白
{
post_pos--;
}
textline=textline.substr(prev_pos,post_pos+1-prev_pos);
return true;//成功读取一有效行
}
}
return false;//读到文件的末尾......
}
/*
*函数功能: 把一个字符串用空白(' ' 或 '\t')分割成一个单词序列. 本字符串应该是有rendline(...)读取后传入的参数,
在本函数里面将不在进行字串最前面和最后面的过滤.(本函数假设传入的字符串是有效字串)
*输入参数: 存储单词序列的容器; 要分割的字串.
*输出参数: 单词序列
*函数返回: 无
*/
void splice(vector& words, string& textline)
{
int pos = 0;
int prev_pos = 0;
string filter(" \t");
while((pos = textline.find_first_of(filter, pos)) != string::npos)
{
words.push_back(textline.substr(prev_pos, pos-prev_pos));
pos = textline.find_first_not_of(filter, pos);
prev_pos = pos;
}
words.push_back(textline.substr(prev_pos, pos-prev_pos));
}
/*
*测试用例...................................................
*/
void test(void)
{
ifstream infile("cn24.txt");
string textline;
cout words;//做临时变量使用,当全局的时候在循环的最后words.resize()用缩小空间
cout::iterator start = words.begin();
vector::iterator end = words.end();
while(start != end)
{
cout
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/14053/showart_151237.html |
|