C++ 用string读一个txt文件,文件的里的内容用tab,回车或者空格隔开。

C++ 用string读一个txt文件,文件的里的内容用tab,回车或者空格隔开。,第1张

方法很多,

① 可以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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/tougao/7956658.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存