c++文件指针Demo代码

#include <iostream>
#include <string>
#include <vector>

int main(){
    std::string infile = "./infile.txt";
    std::ifstream in(infile.c_str()); // 将string对象转为char*
    std::vector<long int> splitlist; // 存储分隔符位置
    splitchar = "\n"; // 将换行符作为分隔符

    if (! in.is_open()) {
        std::cerr << "Error: Invalid file " << infile << std::endl;
        return -1;
    }

    long int maxoffset = 0; // 如果文件没有以分隔符结尾则手动补一个文件结尾位置用
    while(in){
        maxoffset = in.tellg(); // tellg()报告当前指针位置
        if(splitchar == in.get()){
            splitlist.push_back(in.tellg()); // 保存文件中所有分隔符位置
        }
    }
    if (*(splitlist.end()-1) < maxoffset){
        splitlist.push_back(maxoffset+1);
    }

    in.close();
    in.open(infile.c_str(), std::ios::in); // 实测第一次全部文件读完需要重新打开文件。可能重置in的状态可以不用重新打开

    long int rowid = 10; // 以输出文件第十行为例
    std::vector<long int>::iterator iter = splitlist.begin()+(rowid-1); // 找到第十行起始的分隔符在文件中的位置
    in.seekg((*iter), std::ios::beg); // seekg()将文件指针跳转到指定位置
    for(int i=(*iter); i<(*iter)+((*(iter+1))-(*iter))-1; i++){
        // 从第十行起始的分隔符后开始,每次输出一个字符,直到输出完第十行的全部字符
        std::cout << (char)in.get() << std::flush;
    }
    std::cout << std::endl;

    return 0;
}
posted @ 2021-08-23 15:51  esctrionsit  阅读(114)  评论(0编辑  收藏  举报