首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在一个实时数据的ofstream文件中始终有N行

在一个实时数据的ofstream文件中始终有N行,可以通过以下步骤实现:

  1. 打开文件:使用ofstream类打开文件,并设置打开模式为追加模式(append mode),这样每次写入数据时不会覆盖原有内容。
  2. 统计行数:在写入数据之前,先读取文件中的行数。可以使用ifstream类打开文件,并使用getline函数逐行读取数据,同时计数器记录行数。
  3. 判断行数:判断当前行数是否小于N。如果小于N,则直接写入数据。如果大于等于N,则需要删除最早的一行数据。
  4. 删除最早的一行数据:使用ifstream类打开文件,并使用getline函数逐行读取数据,同时使用ofstream类打开同一个文件,并设置打开模式为截断模式(trunc mode),这样会清空文件内容。然后将除最早一行之外的数据重新写入文件。

以下是一个示例代码:

代码语言:txt
复制
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

void writeData(const std::string& filename, const std::string& data, int N) {
    std::ofstream ofs(filename, std::ios::app); // 打开文件,追加模式
    if (!ofs) {
        std::cerr << "Failed to open file for writing." << std::endl;
        return;
    }

    std::ifstream ifs(filename); // 打开文件,读取行数
    if (!ifs) {
        std::cerr << "Failed to open file for reading." << std::endl;
        return;
    }

    int lineCount = 0;
    std::string line;
    while (std::getline(ifs, line)) {
        lineCount++;
    }

    ifs.close();

    if (lineCount < N) {
        ofs << data << std::endl; // 直接写入数据
    } else {
        std::vector<std::string> lines;
        ifs.open(filename); // 重新打开文件,读取除最早一行外的数据
        if (!ifs) {
            std::cerr << "Failed to open file for reading." << std::endl;
            return;
        }

        while (std::getline(ifs, line)) {
            lines.push_back(line);
        }

        ifs.close();

        ofs.close();
        ofs.open(filename, std::ios::trunc); // 打开文件,截断模式

        for (int i = 1; i < lineCount; i++) {
            ofs << lines[i] << std::endl; // 重新写入除最早一行外的数据
        }

        ofs << data << std::endl; // 写入新数据
    }

    ofs.close();
}

int main() {
    std::string filename = "data.txt";
    std::string data = "New data";
    int N = 5;

    writeData(filename, data, N);

    return 0;
}

这段代码会将新的数据写入到名为"data.txt"的文件中,并保持文件中始终有N行数据。如果行数超过N,则会删除最早的一行数据。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++ Primer Plus习题及答案-第十七章

编写一个程序,它打开两个文本文件进行输入,打开一个文本文件进行输出。该程序将两个输入文件对应拼接起来,并用空格分隔,然后将结果写入到输出文件。...如果一个文件比另一个短,则将较长文件余下几行直接复制到输出文件。...该程序应包含程序清单17.17代码,即允许用户将新数据添加到文件。该程序首次被运行时,将要求用户输入数据,然后显示所有的数据,并将这些信息保存到一个文件。...当该程序再次被运行时,将首先读取并显示文件数据,然后让用户添加数据,并显示所有的数据。差别之一是,应通过一个指向employee类型指针数组来处理数据。...一种方法是,在对象数据写入文件时,在数据前面加上一个指示对象类型整数。

3.1K30
  • C++ fstream详解

    大家好,又见面了,我是你们朋友全栈君。 C语言里面对文件操作是通过文件指针,以及一些相关函数,那么C++是如何对文件进行操作呢?没错,就是通过 fstream 这个文件流来实现。...一旦打开了文件,就可以调用函数传递数据并对流进行处理。这些函数都把指向 FILE 对象指针(通常称为 FILE 指针)作为它们参数之一。...两种方式区别见前文 ios::in:    //文件以输入方式打开(文件数据输入到内存) ios::out:    //文件以输出方式打开(内存数据输出到文件) ios::nocreate...()以外,还有一些验证流状态成员函数(所有都返回bool型返回值): is_open():文件是否正常打开 bad():读写过程是否出错(操作对象没有打开,写入设备没有空间) fail():读写过程是否出错...int m,n; m = fin.seekg(0,ios::beg); n = fin.seekg(0,ios::end); //那么n-m就是文件所占字节数 我们也可以从文件末尾出发,反向移动流指针

    1.8K41

    f stream_fstream

    2、析取器(>>)   从流输入数据。比如说系统有一个默认标准输入流(cin),一般情况下就是指键盘,所以,cin>>x;就表示从标准输入流读取一个指定类型(即变量x类型)数据。   ...2、二进制文件读写 ①put()   put()函数向流写入一个字符,其原型是ofstream &put(char ch),使用也比较简单,file1.put(‘c’);就是向流写一个字符’c’。...file2.get(x);表示从文件读取一个字符,并把读取字符保存在x。   ...另一种重载形式原型是: int get();这种形式是从流返回一个字符,如果到达文件尾,返回EOF,x=file2.get();和上例功能是一样。   ...文件是TXT,里面有单词,每个单词占一,我想写一个程序,要求从这个文件找出后两位带er单词,并保存在另一个文件,显示个数!

    48030

    fstream用法_fun 用法

    大家好,又见面了,我是你们朋友全栈君。 在C++输入输出到指定文件,或者从指定文件读出数据使用fstream类较为方便。 C++处理文件类似于处理标准输入和标准输出。...类ifstream、ofstream(向文件写入)和fstream分别从类 istream、ostream和iostream派生而来。...对这些类一个对象所做一个操作通常就是将它和一个真正文件联系起来,也就是说打开一个文件。...被打开文件在程序一个流对象(stream object)来表示 (这些类一个实例) ,而对这个流对象所做任何输入输出操作实际就是对该文件所做操作。...//关闭文件 } 文件操作: 打开文件 文件名 注意路径名斜杠要双写,: “D:\\MyFiles\\ReadMe.txt” 文件打开方式选项: ios::in    = 0x01, /

    3.3K20

    c++fstream是什么意思_汽车配置参数图文详解

    在C++,有一个stream这个类,所有的I/O都以这个“流”类为基础, 一,c++ 文件结构 : ‍1,几个文件流类名称:fstream,ifstream,ofstream,iofstream...比如说系统有一个默认标准输入流(cin),一般情况下就是指键盘,所以,cin>>x;就表示从标准输入流读取一个指定类型(即变量x类型)数据。...: 1,使用put()写数据 put()函数向流写入一个字符,其原型是ofstream &put(char ch),使用也比较简单,file1.put(‘c’);就是向流写一个字符’c’。...file2.get(x);表示从文件读取一个字符,并把读取字符保存在x。...另一种重载形式原型是: int get();这种形式是从流返回一个字符,如果到达文件尾,返回EOF,x=file2.get();和上例功能是一样

    1.2K10

    C++ 利用 ifstream 和 ofstream 读取和修改文件内容

    C 语言读取文件时候很麻烦,C++ 相对来说有很方便库可以用,方便多,所以平常开发推荐使用 C++ 库去读写文件。本文介绍如何利用 C++ 进行最简单读写文件操作。...ifstream ofstream fstream ifstream 是针对文件读取ofstream 是针对文件写入流 fstream 针对文件读取和写入流 打开和关闭文件 打开文件 void...当面对文本类型数据时,比如读取配置文件,我们需要一读取,这个时候需要用到 getLine() 函数。...用法1:直接调用 getline() 函数 ifstream getline(ifstream is,string s) 从 ifstream 一个实例读取一到字符串 s....用法2:调用 ifstream 流对象 getline() 方法 ifstream getline(char* s,size_t n); 从 ifstream 读取数据,最多读取 n ,然后返回流本身

    35K41

    C语言经典100例002-将MN二维数组字符数据,按列顺序依次放到一个字符串

    系列文章《C语言经典100例》持续创作,欢迎大家关注和支持。...喜欢同学记得点赞、转发、收藏哦~ 后续C语言经典100例将会以pdf和代码形式发放到公众号 欢迎关注:计算广告生态 即时查收 1 题目 编写函数fun() 函数功能:将MN二维数组字符数据...,按列顺序依次放到一个字符串 例如: 二维数组数据为: W W W W S S S S H H H H 则字符串内容是:WSHWSHWSH [image.png] 2 思路 第一层循环按照列数进行...M 3 #define N 4 /** 编写函数fun() 函数功能:将MN二维数组字符数据,按列顺序依次放到一个字符串 例如: 二维数组数据为: W W W W S S S...S H H H H 则字符串内容是:WSHWSHWSH **/ // 0 1 2 3 // 0 W W W W // 1 S S S S // 2 H H H H char *fun(char

    6K30

    如何用C++做文件和流

    这就需要用到 C++ 一个标准库 fstream,它定义了三个新数据类型: 数据类型 描述 ofstream数据类型表示输出文件流,用于创建文件并向文件写入信息。...fstream 该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。...下面是 open() 函数标准语法,open() 函数是 fstream、ifstream 和 ofstream 对象一个成员。...但程序员应该养成一个好习惯,在程序终止前关闭所有打开文件。 下面是 close() 函数标准语法,close() 函数是 fstream、ifstream 和 ofstream 对象一个成员。...,比如 getline()函数从外部读取一,ignore() 函数会忽略掉之前读语句留下多余字符。

    64020

    CC++——打开文件读取数据各种方式「建议收藏」

    打开文件 在fstream类,成员函数open()实现打开文件操作,从而将数据流和文件进行关联,通过ofstream,ifstream,fstream对象进行对文件读写操作 函数...若文件不存在,则会建立该文件,如果文件存在,写入数据会被加到文件尾后,即文件原先内容会被保留。 (原来EOF符不保留) wb 只写打开或新建一个二进制文件;只允许写数据。...五、返回值: 如果操作成功,会返回一个非空FILE*指针,该指针用于后续对文件操作,读、写、关闭等。 失败返回NULL。...和fprinf 读取文件 程序1: fgetc函数功能是从指定文件一个字符,函数调用形式为:字符变量=fgetc(文件指针);例如:ch=fgetc(fp);其意义是从打开文件fp读取一个字符并送入...fp);意义是从fp所指文件读出n-1个字符送入字符数组str

    2.5K30

    C++中文件读写操作

    fstreaml类 fstream提供了三个类,用来实现c++对文件操作(文件创建、读、写) fstream 文件流 ifstream 输入文件ofstream 输出文件流 打开文件 文件打开模式...读写操作 读取文件 读取一: infile.getline(data, 100); infile >> data; 在 C++ 编程,使用流提取运算符( >> )从文件读取信息,就像使用该运算符从键盘输入信息一样...唯一不同是,在这里使用是 ifstream 或 fstream 对象. 写入文件 写入一: outfile << data << endl; 使用流插入运算符( << )向文件写入信息....文件指正位置 // 定位到 fileObject n 个字节(假设是 ios::beg) fileObject.seekg( n ); // 把文件读指针从 fileObject 当前位置向后移...n 个字节 fileObject.seekg( n, ios::cur ); // 把文件读指针从 fileObject 末尾往回移 n 个字节 fileObject.seekg( n, ios

    95220

    【C++】IO流

    在使用时候必须要包含文件并引入 std 标准命名空间。 注意: cin 为缓冲流。键盘输入数据保存在缓冲区,当要提取时,是从缓冲区拿。...只有把输入缓冲区数据取完后,才要求输入新数据。 输入数据类型必须与要提取数据类型一致,否则出错。出错只是在流状态字 state 对应位置位(置1),程序继续。...空格和回车都可以作为数据之间分格符,所以多个数据可以在一输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII码为32)无法用 cin 输入,字符串也不能有空格。回车符也无法读入。...采用文件流对象操作文件一般步骤: 定义一个文件流对象: ifstream ifile(只输入用) ofstream ofile(只输出用) fstream iofile(既输入又输出用) 使用文件流对象成员函数打开一个磁盘文件...,当我们打开一个文件: 如果在同一个进程,WriteBin 写入时候向文件写入是 string _str 指针、_size、_capacity,而 ReadBin 读取出来时候是原封不动地将文件内容读取到另外一个对象

    15910

    C++ fstream文件流读写文件操作详解

    要求: 掌握文本文件读写方法 了解二进制文件读写方法C++文件流: fstream  // 文件流 ifstream  // 输入文件ofstream  // 输出文件流 //创建一个文本文件并写入信息...,: “D://MyFiles//ReadMe.txt” 文件打开方式选项: ios::in    = 0x01, //供读,文件不存在则创建(ifstream默认打开方式) ios::out...使用eof()函数检测文件是否读结束,使用gcount()获得实际读取字节数 关闭文件 使用成员函数close,: f.close(); 利用析构函数 对象生命期结束时会检查文件是否关闭,...ios::cur  = 1       //相对于当前位置 ios::end  = 2       //相对于文件尾 读写文本文件示例 //为能够正确读出写入文件数据,各数据间最好要有分隔...=EOF)cout<<c; //注意结束条件判断  fin.close();  } //使用get(char *,int n,char delim=’/n’)一次读多个字符—-方案二 //巧妙利用文本文件不会有字符

    2.7K20

    【C++】一文掌握C++IO流

    2.可以使用这部分内容实现“”读取行为,对于计算机而言是没有“”这个概念,有了这部分,就可以定义“概念,然后解析缓冲区内容,返回一个”。...3.4 文件操作 对于文件读取写入,可以使用ifstream和ofstream,或者直接使用fsteam(继承了ifstream和ofstream)。...如果文件已经存在,则在打开时将其长度截断为0,即删除文件所有内容 打开文件之后就要进行写入或者读取了: 写入操作可以使用<<进行流写入,也可以通过write写入一个缓冲区字符串。...ofs("copy.png", ofstream::out | ofstream::binary); int n = 0; char ch = ifs.get(); while (ifs.good...因为string本质上是一个结构体,在内存时以结构体储存,而内部字符串是一个指针,指向一个堆空间。

    11310

    何在VS清空cin缓冲区(C++)

    //以文本文件方式写入 void test01() { cout >" << endl; int n; cout << "要输入行数:"; cin...,直接跳转到第二 问题排查 首先想到就是第一次循环自动读入了一个换行符,因为在实际输入内容之前,要先输入行数然后回车。...一次输入过程是这样,当一次键盘输入结束时会将输入数据存入输入缓冲区,而cin对象直接从输入缓冲区数据。...当cin>>从缓冲区读取数据时,若缓冲区一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。...但是,getline()读取数据时,并非像cin>>那样忽略第一个换行符,getline()发现cin缓冲区中有一个残留换行符,不阻塞请求键盘输入,直接读取,送入目标字符串后,再将换行符替换为空字符

    2.2K30

    c++ 文件操作详解

    被打开文件在程序一个流对象(stream object)来表示 (这些类一个实例) ,而对这个流对象所做任何输入输出操作实际就是对该文件所做操作。...关闭文件(Closing a file) 当文件读写操作完成之后,我们必须将文件关闭以使文件重新变为可访问。关闭文件需要调用成员函数close(),它负责将缓存数据排放出来并关闭文件。...从文件读入数据也可以用与 cin使用同样方法: // reading a text file #include #include #include...二进制文件(Binary files) 在二进制文件,使用>,以及函数(getline)来操作符输入和输出数据,没有什么实际意义,虽然它们是符合语法。...文件流包括两个为顺序读写数据特殊设计成员函数:write 和 read。第一个函数 (write) 是ostream 一个成员函数,都是被ofstream所继承。

    1.9K60
    领券