100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > C++文件流fstream详细说明

C++文件流fstream详细说明

时间:2021-06-18 02:07:42

相关推荐

C++文件流fstream详细说明

C++文件流。

首先需要包含头文件#include< fstream >

fstream可以把它理解成一个父类,包含的子类有ifstream和ofstream等,

fstream:文件输入输出类。表示文件级输入输出流(字节流);

ifstream:文件输入类。表示从文件内容输入,也就是读文件;

ofstream:文件输出类。表示文件输出流,即文件写。

所以一般直接创建一个父类对象即可(即fstream类的对象)

C++中seep()和seekg()函数功能

seekg:设置输入文件流的文件流指针位置

seekp:设置输出文件流的文件流指针位置

C++文件流检测EOF

成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。原型是inteof();

例:if(in.eof())ShowMessage("已经到达文件尾!");

C++文件流文件定位

和C的文件操作方式不同的是,C++ I/O系统管理两个与一个文件相联系的指针。一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。每次执行输入或输出时,相应的指针自动变化。所以,C++的文件定位分为读位置和写位置的定位,对应的成员函数是 seekg()和 seekp(),seekg()是设置读位置,seekp是设置写位置。它们最通用的形式如下:

1. istream &seekg(streamoff offset,seek_dir origin);

2. ostream &seekp(streamoff offset,seek_dir origin);

函数原型:

ostream& seekp( streampos pos );

ostream& seekp( streamoff off, ios::seek_dir dir );

istream& seekg( streampos pos );

istream& seekg( streamoff off, ios::seek_dir dir );

函数参数

pos:新的文件流指针位置值

off:需要偏移的值

dir:搜索的起始位置

dir参数用于对文件流指针的定位操作上,代表搜索的起始位置

seekg(绝对位置);//绝对移动,//输入流操作

seekg(相对位置,参照位置);//相对操作

tellg();//返回当前指针位置

seekp(绝对位置);//绝对移动,//输出流操作

seekp(相对位置,参照位置);//相对操作

tellp();//返回当前指针位置

在ios中定义的枚举类型:

enum seek_dir {beg, cur, end};

每个枚举常量的含义:

ios::beg:文件流的起始位置

ios::cur:文件流的当前位置

ios::end:文件流的结束位置

这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。

例:

1. file1.seekg(1234,ios::cur);//把文件的读指针从当前位置向后移1234个字节

2. file2.seekp(1234,ios::beg);//把文件的写指针从文件开头向后移1234个字节

下边的代码讲解了

1:4种文件的读写操作

2:如何使用get(),put(),getline(),write()以及read()函数。

3:如何得到文件的大小。

4:seekg()和teelg()配套使用的真谛,seekp()和teelp()同理

//文件流;

#include<iostream>

#include<fstream> //ifstream ofstream

using namespace std;

/*

No1.文件流流类

ofstream:打开文件,写文件

ifstream:打开文件,读操作

fstream:可读可写

No2.一般用包含#include<fstream>

No3.打开文件,关闭文件

打开文件:

void open(const char* URL,ios::openmode mode);

mode:

ios:in 读的方式打开文件

ios:out 写的方式打开文件

ios::app 追加的方式写文件

ios::ate 在已有的文件,文件指针在文件末尾

ios::trunc 文件不存在,创建文件

ios::binary 二进制形式打开文件,默认方式ASCII码方式打开

ios::nocreate 不创建的方式

ios::norepalce 不替换

组合方式:用的是位或

ios::in|ios::out 可读写

ios::out|ios::binary 二进制写的方式打开文件,

判断文件是否打开成功:

1.is_open() 判断打开是否成功

2.!文件对象 判断文件是否打开成佛那个

关闭文件:close()成员函数关闭;

*/

void testOpenFile() { //用于测试用的函数

//C++中打开文件是文件对象,不是文件指针。

fstream File,File1;

File.open("2.txt", ios::in | ios::out );

File1.open("3.txt", ios::in | ios::out | ios::trunc);

//使用open函数和直接用构造函数是一样的效果。

if (!File.is_open()) {

cerr << "2.txt 打开文件失败!!\n";

}

if (!File) {

cerr << "2.txt打开文件失败!!!\n";

}//这个if语句和上一个if语句作用相同

if (!File1.is_open()) {

cerr << "3.txt打开文件失败!!\n";

}

else {

cout << "3.txt 打开成功!!!\n";

}

File.close();

File1.close();

}

//No2.读写方式:

void asciiReadWriteFile(const char* readFileName, const char* writeFileName) {

fstream read(readFileName, ios::in);

fstream write(writeFileName, ios::out);

//第一种读写方式:ASCII 直接流的方式读写, >> <<

/*while (1) {

char temp;

read >> temp;

if (read.eof()) {

break;

}

write << temp;

}*/

//第二种方式读写方式:可以保留空格和换行,用get()和put();

/*while (1) {

char temp;

read.get(temp);

//temp=read.get();一样的效果!

if (read.eof()) {

break;

}

write.put(temp);

}*/

//第三种读写方式:不能保留空格和换行,用getline()和write().

char str[40];

while (!read.eof()) {

memset(str, ' ', 40);

read.getline(str,40);

int len = strlen(str);

write.write(str,len);

write.put('\n');

}

}

//使用二进制读写方式 使用read()和write()函数来实现

void binaryReadWriteFile(const char* readFile, const char* writeFile) {

fstream read(readFile, ios::in | ios::binary);

fstream write(writeFile, ios::out | ios::binary);

while (!read.eof()) {

char str[1024]="";

read.read(str, 1024);

write.write(str, 1024);

}

read.close();

write.close();

}

//

void testSeekReadFile(const char* fileName) {

fstream fread(fileName, ios::in);

fstream fwrite(fileName, ios::app|ios::out);

if (!fread) {

cerr << "打开文件\"fileName\"!失败!";

}

int f = fread.tellg();

fread.seekg(0,ios::end);

int l = fread.tellg();

cout << "size of " << fileName << "is "<<(l - f) << "bytes.";

fread.seekg(5);//表示将指针位置设置到绝对位置5;

cout << (char)fread.get() << endl;

fread.seekg(-1, ios::cur); //seekg的第一个参数为负,表示从当前位置往前移

cout << (char)fread.get() << endl;

fread.seekg(1, ios::cur);//第一个参数为正,表示从当前位置往后数的第一个位置。

fwrite.put('w');//在末尾追加写。

}

int main() {

testOpenFile();

asciiReadWriteFile("read.txt","write.txt");

binaryReadWriteFile("read.txt", "binaryTest.txt");

testSeekReadFile("read.txt");

return 0;

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。