C++ 用string读一个txt文件,文件的里的内容用tab,回车或者空格隔开。
如:内容一tab内容二空格内容三回车内容四,希望在读取的时候,只有tab和回车起到分割内容的作用,而把空格看做内容本身,不起作用。也就是希望file>>string的时候...
如:内容一tab内容二空格内容三回车内容四,希望在读取的时候,只有tab和回车起到分割内容的作用,而把空格看做内容本身,不起作用。也就是希望file>>string的时候,能够获得内容一,内容二 内容三,内容四。怎么实现?
展开
3个回答
展开全部
方法很多,
① 可以c的函数strtok,可以一次搞定;问题是这个函数需要拷贝原字符串,因为它要破坏字符串,如果文本文件大,效率就会低; 而且是线程不安全的。
② 可以使用boost::tokenizer, 很方便, 不过需要按照第3方的boost库;
③ 也可以用pcre的正则库, 也很好用;
④ 自己写一个, string, STL的; 下面是用stringstream的一个实现,结合了std:getline()。因为你这个例子,其实回车是getline自动考虑了, 只要定义“\t”(tab制表符)即可。
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
int main()
{
ifstream ifs("data.txt");
string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
//cout << str.c_str() << endl;
stringstream ss(str);
string s;
while (getline (ss,s,'\t'))
{
cout << s << endl;
}
return 0;
}
注意: 这个文件的字符是char, 如果是unicode的文件, 用wchar_t替换char。
① 可以c的函数strtok,可以一次搞定;问题是这个函数需要拷贝原字符串,因为它要破坏字符串,如果文本文件大,效率就会低; 而且是线程不安全的。
② 可以使用boost::tokenizer, 很方便, 不过需要按照第3方的boost库;
③ 也可以用pcre的正则库, 也很好用;
④ 自己写一个, string, STL的; 下面是用stringstream的一个实现,结合了std:getline()。因为你这个例子,其实回车是getline自动考虑了, 只要定义“\t”(tab制表符)即可。
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
int main()
{
ifstream ifs("data.txt");
string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
//cout << str.c_str() << endl;
stringstream ss(str);
string s;
while (getline (ss,s,'\t'))
{
cout << s << endl;
}
return 0;
}
注意: 这个文件的字符是char, 如果是unicode的文件, 用wchar_t替换char。
追问
谢谢!这个文件是UTF-8编码的,很多符号都判断不出来。这个应该怎么办呢?
追答
不就是tab和回车吗? 还有其他的字符?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询