C++文件fstream的操作

摘要:
关于输入/输出fstream流的知识1.两个主要函数:read()函数从流中读取字符串的成员函数。此成员函数的一般形式是:read从输入流中读取nCount个字符。Ofstream类似于ostream,有一个指针putpointer,指向下一个元素的写入位置。

                用到的关于输入输出fstream流相关的知识

1.两个主要函数:read( )函数

从流中读取字符串的成员函数read
该成员函数一般形式是:read(char* pch, int nCount)
从输入流中读取nCount个字符。当输入流中的字符数小于nCount时,结束读取。经常使用read函数读取二进制数据。
write( )函数
成员函数write()输出一串字符。
该成员函数一般形式是:write(char* pch, int nCount)
其中,pch是指向字符数组的指针; nCount指明从第一个参数中复制输出字符的个数。
2. 文件的随机读写
(1)输出流随机访问函数
输出流(output)随机访问函数有seekp和tellp。
(2)输入流随机访问函数
  输入流随机访问函数有seekg和tellg。

3. 获得和设置流指针(get and put stream pointers)
所有输入/输出流对象(i/o streams objects)都有至少一个流指针:

ifstream, 类似istream, 有一个被称为get pointer的指针,指向下一个将被读取的元素。ofstream, 类似 ostream, 有一个指针 put pointer ,指向写入下一个元素的位置。

fstream, 类似 iostream, 同时继承了get 和 put

4. 设置流指针位置
我们可以通过使用以下成员函数来读出或配置这些指向流中读写位置的流指针:
tellg() 和 tellp()
这两个成员函数不用传入参数,返回pos_type 类型的值(根据ANSI-C++ 标准) ,就是一个整数,代表当前get 流指针的位置 (用tellg) 或 put 流指针的位置(用tellp).
seekg() 和seekp()
这对函数分别用来改变流指针get 和put的位置。两个函数都被重载为两种不同的原型:
seekg ( pos_type position );
seekp ( pos_type position );
使用这个原型,流指针被改变为指向从文件开始计算的一个绝对位置。要求传入的参数类型与函数 tellg 和tellp 的返回值类型相同。
seekg ( off_type offset, seekdir direction );
seekp ( off_type offset, seekdir direction );
使用这个原型可以指定由参数direction决定的一个具体的指针开始计算的一个位移(offset)。它可以是:
ios::beg 从流开始位置计算的位移
ios::cur 从流指针当前位置开始计算的位移
ios::end 从流末尾处开始计算的位移
流指针 get 和 put 的值对文本文件(text file)和二进制文件(binary file)的计算方法都是不同的,因为文本模式的文件中某些特殊字符可能被修改。
由于这个原因,建议对以文本文件模式打开的文件总是使用seekg 和 seekp的第一种原型,而且不要对tellg 或 tellp 的返回值进行修改。

对二进制文件,你可以任意使用这些函数,应该不会有任何意外的行为产生

#include <fstream>
#include <iostream>
#include <cstring>
using namespacestd;
intmain ()
{
    long pos;//存储写指针位置(字节)
    char array[100]; //字符数组用来存放从文件中读取的字符串

    ofstream outfile; //建立输出文件流对象

    ifstream infile;  //建立输入文件流对象

    outfile.open ("test.txt"); //将输出流对象与test.txt文件关联

    infile.open ("test.txt");  //将输入流对象与test.txt文件关联
    if(!outfile&&!infile)
    {
        cout<<"file error!";
        exit(1);
    }
    cout<<"开始写入时,写指针位置为:"<<outfile.tellp()<<endl; 
    //outfile.write ("This is an apple.",sizeof("This is an apple.")-1); //参见输出流的write方法,向文件test.txt中输出字符串
    outfile.write ("This is an apple.",strlen("This is an apple.")); //参见输出流的write方法,向文件test.txt中输出字符串

    pos=outfile.tellp();//获取写入字符串后,写指针位置(与文件开始之间的字节数)

    cout<<"写入后,写指针位置为:"<<pos<<endl;   
    cout<<"开始读入时,读指针位置为:"<<infile.tellg()<<endl;
    infile.getline(array,pos+1); //将test.txt读取的内容存入数组array中

    cout<<"读入后,读指针位置为:"<<infile.tellg()<<endl;
    cout<<array<<endl;
    outfile.seekp (pos-8);//将写指针从当前位置向后移动(文件开头位置)8个字节

    pos=outfile.tellp();//获取写指针移动后,写指针位置(与文件开始之间的字节数)

    cout<<"将当前指针向前移动8个字节后,写指针位置为:"<<outfile.tellp()<<endl;
    outfile.write ("sam",sizeof("sam")-1); //在从当前写指针位置开始写入字符串

    pos=outfile.tellp();//获取再次写入后,写指针位置(与文件开始之间的字节数)

    cout<<"再此写入后,写指针位置为:"<<pos<<endl;
    infile.seekg(0,ios::beg); //读指针定位到文件开头

    cout<<"重新从文件开头读入时,读指针位置为:"<<infile.tellg()<<endl;
    outfile.seekp(0,ios::end); //文件的写指针定位到文件最后

    pos=outfile.tellp();//获取写指针位置(与文件开始之间的字节数)

    cout<<"将写指针定位到文件最后位置为:"<<pos<<endl;
    infile.sync();//清除缓冲区
    infile.clear();//清除错误状态,在这个程序里,两个必须一起用,否则  达不到效果
    //以上两条语句非常重要,如果去掉,就读不进来了

    infile.getline(array,pos+1); //将test.txt读取的内容存入数组array中

    cout<<"读入后,读指针位置为:"<<infile.tellg()<<endl; 
    cout<<array<<endl;
    outfile.close(); //关闭文件

    infile.close(); //关闭文件
    return 0;
}

C++文件fstream的操作第1张

注意:由于ifstream的读入文件不正常,导致读文件指针一直不正确。

每次写入后,都自动更新当前写指针的位置。

免责声明:文章转载自《C++文件fstream的操作》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇LeetCode——x 的平方根/有效的完全平方数将excel中的数据转为json格式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Jmeter之 forEach 遍历所有值

今天遇到一个场景,通过正则表达式提取多个值,然后保存到文件中去 正则表达式 1、一开始的思路是通过后置 Beanshell断言进行,得到文件数据为 null FileWriter fstream=new FileWriter ("D://test.csv",true); BufferedWriter out=new BufferedWriter(fstre...

C++ fstream文件读取操作

1.在头文件fstram中,定义了了三个类型:ifstream用来从一个给定文件中读取数据,ofstream向一个给定文件写入数据,fstream读写指定文件。 2.fstream是iostream的一个基类,所以我们也可以使用<<、>>、getline等来操作fstream 3.使用>>从文件中读取数据,和从控制cin...

c++读写二进制文件

要读取文件必须包含<fstream>头文件,这里包含了C++读写文件的方法,可以使用fstream 类,这个类可以对文件进行读写操作。   1、打开文件。   打开文件可以有两种方式,第一种可以使用fstream 类的构造函数。 ios::in :输入文件(同ios_base::in) ios::out :输出文件(同ios_base::out...

关于seekg失效的问题

当file.eof()=1的时候seekg就不好用了,当file.eof()=0的时候seekg是好用的。也就是说当一个文件读到尾部以后,不能再用seekg来移动或者定位了。通过建立该文件新的对象能解决这个问题。 如果只是输出的话可以用streambuf的rdbuf #include<fstream>#include<iostream&g...

C/C++文件输入输出操作——FILE*、fstream、windowsAPI

基于C的文件操作在ANSI C中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。 一、流式文件操作这种方式的文件操作有一个重要的结构FILE,FILE在头文件stdio.h中定义如下: typedef struct {int level;unsigned flags;char fd;unsigned char hold;int...

C++标准库之IO库(一)

概述 C++语言与C语言一样,语言本身并不提供输入输出的支持,它们实现输入输出都是通过标准库来完成的。C语言的标准库提供一系列可以用来实现输入输出的函数,C++标准库则提供一系列类和对象来完成输入输出的功能,并且提供了流的概念,标准库中的IO类都是流概念的类。C++标准库中80%的内容属于STL,而IO库并不属于这80%。IO库体现的是面向对象的思想,但是...