① 可以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。
这里假设string类型可能包含任意字符。否则,只需用不可能出现的字符分隔开即可。
因此,唯一的办法是将string的长度也写入到文件当中。下面是示例:
#include <string>#include <fstream>
#include <sstream>
#include <vector>
#include <iostream>
inline void WriteString(std::ostream& ostr, std::string const& str) {
// 写入字符串长度
ostr << str.size() << "\n"
// 写入字符串
ostr.write(str.data(), str.size())
}
inline std::string ReadString(std::istream& istr) {
// 获取字符串长度
std::string line
std::getline(istr, line)
std::istringstream tmp(line)
std::size_t size
tmp >> size
// 读取字符串
std::vector<char> result(size)
istr.read(result.data(), size)
return std::string(result.begin(), result.end())
}
int main() {
std::string const filename = "t.txt", s1 = "string 1 \n Yeah!", s2 = "string 2 \\ Yep!"
{
std::ofstream ostr(filename)
WriteString(ostr, s1)
WriteString(ostr, s2)
}
{
std::ifstream istr(filename)
std::cout << (ReadString(istr) == s1 && ReadString(istr) == s2) << "\n"
}
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)