C++文件操作基础 读写文本、二进制文件 输入输出流 文件位置指针以及随机存取 文件缓冲区以及流状态

这篇具有很好参考价值的文章主要介绍了C++文件操作基础 读写文本、二进制文件 输入输出流 文件位置指针以及随机存取 文件缓冲区以及流状态。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、写入文本文件

文本文件一般以行的形式组织数据。
包含头文件:#include <fstream>
类:ofstream(output file stream)
ofstream 打开文件的模式(方式):类内open()成员函数参数2.参数1是文件存储/创建路径

例如:fout.open(filename,ios::app);
对于 ofstream,不管用哪种模式打开文件,如果文件不存在,都会创建文件。
ios::out 缺省值:会截断文件内容。
ios::trunc 截断文件内容。(truncate)
ios::app 不截断文件内容,只在文件未尾追加文件。(append)

主要关注路径与文件名书写方法,推荐使用原始字面量和绝对路径,还有打开写入关闭等操作。

具体演示和步骤如下:

#include <iostream>
#include <fstream> // ofstream 类需要包含的头文件。
using namespace std;
int main()
{
// 文件名一般用全路径,书写的方法如下:
// 1)"D:\data\txt\test.txt" // 错误。
// 2)R"(D:\data\txt\test.txt)" // 原始字面量,C++11 标准。
// 3)"D:\\data\\txt\\test.txt" // 转义字符。
// 4)"D:/tata/txt/test.txt" // 把斜线反着写。
// 5)"/data/txt/test.txt" // Linux 系统采用的方法。
string filename = R"(D:\data\txt\test.txt)";
//char filename[] = R"(D:\data\txt\test.txt)";
// 创建文件输出流对象,打开文件,如果文件不存在,则创建它。
// ios::out 缺省值:会截断文件内容。
// ios::trunc 截断文件内容。(truncate)
// ios::app 不截断文件内容,只在文件未尾追加文件。(append)
//ofstream fout(filename);
//ofstream fout(filename, ios::out);
//ofstream fout(filename, ios::trunc);
//ofstream fout(filename, ios::app);
ofstream fout;
fout.open(filename,ios::app);
// 判断打开文件是否成功。
// 失败的原因主要有:1)目录不存在;2)磁盘空间已满;3)没有权限,Linux 平台下很常见。
if (fout.is_open() == false)
{
cout << "打开文件" << filename << "失败。\n"; return 0;
}
// 向文件中写入数据。
fout << "test1\n";
fout << "test2\n";
fout << "test3\n";
fout.close(); // 关闭文件,fout 对象失效前会自动调用 close()。
cout << "操作文件完成。\n";
}

二、读取文本文件

包含头文件:#include <fstream>
类:ifstream
ifstream 打开文件的模式(方式):
对于 ifstream,如果文件不存在,则打开文件失败。
ios::in 缺省值。

重点在于读取方法,具体演示如下:

#include <iostream>
#include <fstream> // ifstream 类需要包含的头文件。
#include <string> // getline()函数需要包含的头文件。
using namespace std;
int main()
{
// 文件名一般用全路径,书写的方法如下:
// 1)"D:\data\txt\test.txt" // 错误。
// 2)R"(D:\data\txt\test.txt)" // 原始字面量,C++11 标准。
// 3)"D:\\data\\txt\\test.txt" // 转义字符。
// 4)"D:/tata/txt/test.txt" // 把斜线反着写。
// 5)"/data/txt/test.txt" // Linux 系统采用的方法。
string filename = R"(D:\data\txt\test.txt)";
//char filename[] = R"(D:\data\txt\test.txt)";
// 创建文件输入流对象,打开文件,如果文件不存在,则打开文件失败。。
// ios::in 缺省值。
//ifstream fin(filename);
//ifstream fin(filename, ios::in);
ifstream fin;
fin.open(filename,ios::in);
// 判断打开文件是否成功。
// 失败的原因主要有:1)目录不存在;2)文件不存在;3)没有权限,Linux 平台下很常见。
if (fin.is_open() == false)
{
cout << "打开文件" << filename << "失败。\n"; return 0;
}
 第一种方法。
//string buffer; // 用于存放从文件中读取的内容。
 文本文件一般以行的方式组织数据。
//while (getline(fin, buffer))
//{
// cout << buffer << endl;
//}
 第二种方法。
//char buffer[16]; // 存放从文件中读取的内容。
 注意:如果采用 ifstream.getline(),一定要保证缓冲区足够大。
//while (fin.getline(buffer, 15))
//{
// cout << buffer << endl;
//}
// 第三种方法。
string buffer;
while (fin >> buffer)
{
cout << buffer << endl;
}
fin.close(); // 关闭文件,fin 对象失效前会自动调用 close()。
cout << "操作文件完成。\n";
}

三、读写二进制文件

包含头文件:#include <fstream>
类:ofstream(output file stream)
ofstream 打开文件的模式(方式):
对于 ofstream,不管用哪种模式打开文件,如果文件不存在,都会创建文件。
ios::out 缺省值:会截断文件内容。
ios::trunc 截断文件内容。(truncate)
ios::app 不截断文件内容,只在文件未尾追加文件。(append)
ios::binary 以二进制方式打开文件。
操作文本文件和二进制文件的一些细节:
1)在 windows 平台下,文本文件的换行标志是"\r\n"
2)在 linux 平台下,文本文件的换行标志是"\n"
3)在 windows 平台下,如果以文本方式打开文件,写入数据的时候,系统会将"\n"转换成
"\r\n";读取数据的时候,系统会将"\r\n"转换成"\n"。 如果以二进制方式打开文件,写和读都不会进行转换。
4)在 Linux 平台下,以文本或二进制方式打开文件,系统不会做任何转换。
5)以文本方式读取文件的时候,遇到换行符停止,读入的内容中没有换行符;以二制方式读取文件的时候,遇到换行符不会停止,读入的内容中会包含换行符(换行符被视为数据)。

6)在实际开发中,从兼容和语义考虑,一般:a)以文本模式打开文本文件,用行的方法操作它;
b)以二进制模式打开二进制文件,用数据块的方法操作它;c)以二进制模式打开文本文件和二进制文件,用数据块的方法操作它,这种情况表示不关心数据的内容。(例如复制文件和传输文件)d)不要以文本模式打开二进制文件,也不要用行的方法操作二进制文件,可能会破坏二进制数据文件的格式,也没有必要。(因为二进制文件中的某字节的取值可能是换行符,但它的意义并不是换行,可能是整数n 个字节中的某个字节)

fstream 打开文件的模式(方式):
对于 ifstream,如果文件不存在,则打开文件失败。

演示:(不熟悉网络通讯也可以尝试看看这个用语发送文件的简单成员函数,不用管有些没见过的函数,主要认识二进制数据块读出和写入。)需要注意write()和read()成员函数。

bool recvfile(const string &filename,const size_t filesize){
ofstream fout(filename,ios::binary);
if(fout.is_open()==false){cout<<"打开文件失败"<<endl;return false;}
 
int onread=0;//每次调用fin.read()打算读取的字节数
int totalbytes=0;//从文件中已读取的总字节数
char buffer[4096];//每次存放读取数据的字节数
 
while(true){//计算本次应接收数据的字节数
if(filesize-totalbytes>4096)onread=4096;
else onread=filesize-totalbytes;
 
if(recv(buffer,onread)==false)return false;//接收文件数据
 
fout.write(buffer,onread);//将接收的文件写入
totalbytes+=onread;//更新已接收文件字节数
 
if(filesize==totalbytes)break;
}
return true;
}
 //向服务端发送文件内容
bool sendfile(const string& filename,const size_t filesize){
//以二进制的方法打开文件
ifstream fin(filename,ios::binary);
if(fin.is_open()==false){cout<<"打开文件:"<<filename<<"失败\n"<<endl;return false;}
 
int onread=0; //每次调用fin.read()打算读取的字节数
int totalbytes=0;//从文件中已读取的总字节数
char buffer[4096];//每次存放读取数据的字节数
 
while(true){
if(filesize-totalbytes>4096)onread=4096;//如果剩余数据字节数大于4096,则这次循环打算读取的数据字节数为4096
else onread=filesize-totalbytes;//否则就读取剩余数据的字节数
 
fin.read(buffer,onread);//读取数据并存入buffer
 
if(send(buffer,onread)==false)//向服务端发送数据return false;
totalbytes+=onread;//更新已读数据量
if(totalbytes==filesize)break;//如果全部数据读取完break
}
return true;
}

三、随机存取

1.fstream 类

fstream 类既可以读文本/二进制文件,也可以写文本/二进制文件。
fstream 类的缺省模式是 ios::in | ios::out,如果文件不存在,则创建文件;但是,不会清空文件原
有的内容。

普遍的做法是:
1)如果只想写入数据,用 ofstream;如果只想读取数据,用 ifstream;如果想写和读数据,用 fst
ream,这种情况不多见。不同的类体现不同的语义。
2)在 Linux 平台下,文件的写和读有严格的权限控制。(需要的权限越少越好)

2.文件的位置指针

对文件进行读/写操作时,文件的位置指针指向当前文件读/写的位置。不论读还是写所使用的类以及相关函数,文件位置指针有且只有一个,所有操作都在使用这一个指针,没有读指针和写指针这种说法。

1)获取文件位置指针

ofstream 类的成员函数是 tellp();ifstream 类的成员函数是 tellg();fstream 类两个都有,效果相
同。
std::streampos tellp();
std::streampos tellg();

2)移动文件位置指针
ofstream 类的函数是 seekp();ifstream 类的函数是 seekg();fstream 类两个都有,效果相同。
方法一:
std::istream & seekg(std::streampos _Pos);
fin.seekg(128); // 把文件指针移到第 128 字节。
fin.seekp(128); // 把文件指针移到第 128 字节。
fin.seekg(ios::beg) // 把文件指针移动文件的开始。
fin.seekp(ios::end) // 把文件指针移动文件的结尾。
方法二:
std::istream & seekg(std::streamoff _Off,std::ios::seekdir _Way);
在 ios 中定义的枚举类型:
enum seek_dir {beg, cur, end}; // beg-文件的起始位置;cur-文件的当前位置;end-文件的结尾位置。
fin.seekg(30, ios::beg); // 从文件开始的位置往后移 30 字节。
fin.seekg(-5, ios::cur); // 从当前位置往前移 5 字节。
fin.seekg( 8, ios::cur); // 从当前位置往后移 8 字节。
fin.seekg(-10, ios::end); // 从文件结尾的位置往前移 10 字节。


2)随机存取

是指直接移动文件的位置指针,在指定位置读取/写入数据。现在再来看:

ios::out 1)会截断文件;2)可以用 seekp()移动文件指针。
ios:trunc 1)会截断文件;2)可以用 seekp()移动文件指针。
ios::app 1)不会截断文件;2)文件指针始终在文件未尾,不能用 seekp()移动文件指针。
ios::ate 打开文件时文件指针指向文件末尾,但是,可以在文件中的任何地方写数据。
ios::in 打开文件进行读操作,即读取文件中的数据。
ios::binary 打开文件为二进制文件,否则为文本文件。
注:ate 是 at end 的缩写,trunc 是 truncate(截断)的缩写,app 是 append(追加)的缩写。

四、缓冲区及流状态

1.文件缓冲区

文件缓冲区(缓存)是系统预留的内存空间,用于存放输入或输出的数据。
根据输出和输入流,分为输出缓冲区和输入缓冲区。
注意,在 C++中,每打开一个文件,系统就会为它分配缓冲区。不同的流,缓冲区是独立的。
一般来说不用关心输入缓冲区,只关心输出缓冲区就行了。
在缺省模式下,输出缓冲区中的数据满了才把数据写入磁盘,但是,这种模式不一定能满足业务的
需求。
输出缓冲区的操作:
1)flush()成员函数
刷新缓冲区,把缓冲区中的内容写入磁盘文件。
2)endl  换行,然后刷新缓冲区。
3)unitbuf
fout << unitbuf;
设置 fout 输出流,在每次操作之后自动刷新缓冲区。
4)nounitbuf
fout << nounitbuf;
设置 fout 输出流,让 fout 回到缺省的缓冲方式。

2.流状态

流状态有三个:eofbit、badbit 和 failbit,取值:1-设置;或 0-清除。
当三个流状成都为 0 时,表示一切顺利,good()成员函数返回 true。

1)eofbit
当输入流操作到达文件未尾时,将设置 eofbit。
eof()成员函数检查流是否设置了 eofbit。
2)badbit
无法诊断的失败破坏流时,将设置 badbit。(例如:对输入流进行写入;磁盘没有剩余空间)。
bad()成员函数检查流是否设置了 badbit。
3)failbit
当输入流操作未能读取预期的字符时,将设置 failbit(非致命错误,可挽回,一般是软件错误,例
如:想读取一个整数,但内容是一个字符串;文件到了未尾)I/O 失败也可能设置 failbit。
fail()成员函数检查流是否设置了 failbit。

4)clear()成员函数清理流状态。
5)setstate()成员函数重置流状态。文章来源地址https://www.toymoban.com/news/detail-824921.html

五、End.

到了这里,关于C++文件操作基础 读写文本、二进制文件 输入输出流 文件位置指针以及随机存取 文件缓冲区以及流状态的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言--文件操作详解(2)(文本文件和二进制文件,文件读取结束的判定,用函数进行文件的拷贝,文件缓冲区)

    本篇文章主要介绍了文本文件和二进制文件,文件读取结束的判定,如何使用函数进行文件的拷贝,文件缓冲区的相关知识。 以及具有保存功能的八功能通讯录的源码。 据数据的组织形式,数据文件被称为文本文件或者二进制文件。 ①数据在内存中以二进制的形式存储,如

    2024年02月08日
    浏览(37)
  • Python读写二进制文件

    Python 读写文件的二进制数据需要使用到struct模块,进行C/C++与Python数据格式的转换。 struct模块中最常用的函数为pack和unpack,用法如下: 函数 return explain pack(fmt,v1,v2…) string 按照给定的格式(fmt),把数据转换成字符串(字节流),并将该字符串返回. pack_into(fmt,buffer,offset,v1,v2…) No

    2024年02月08日
    浏览(33)
  • C# 流Stream详解(1)——读写txt和二进制文件

    【读写txt文件】 电脑手机上有各种各样的文件,例如视频文件、图片文件、文本文件,其中读写txt文件是最简单的,有多种方式, 使用StreamReader和StreamWriter 使用TextReader和TextWriter   使用FileStream 使用File类提供的静态方法 上面几种方法代码都很长,一般来说我们几乎不会使

    2024年02月06日
    浏览(32)
  • C++:通过ofstream写入二进制文件内容

    C++:通过ifstream读取二进制文件内容_c++ ifstream 二进制读取-CSDN博客 介绍了读取二进制文件的方法。 本文介绍一下写入二进制数据到文件的方法: 1.通过write

    2024年01月19日
    浏览(39)
  • git中某些二进制文件无法合并,怎么操作pull更新

    当在Git中进行`pull`操作时,如果遇到某些二进制文件无法合并的情况,通常会导致冲突。 1. 首先,运行`git status`命令,查看哪些文件存在冲突。   2. 打开冲突的文件,正常情况下,.h或者.cpp文件,你会看到类似下面的内容:    ```     HEAD    // 本地版本的内容    =======  

    2024年01月18日
    浏览(29)
  • C语言文本模式和二进制模式

    本篇文章介绍一下C语言的文本模式和二进制模式 从宏观上看,无论是文本文件还是二进制文件,文件中保存的都是 0和1的序列 ,因为磁盘只有这两种状态。不同的文件只是对0、1序列的解释不同, 如果文件内容是以字符编码的方式保存到文件中的 ,无论是以哪种编码方式,

    2024年02月05日
    浏览(26)
  • 肉眼无法读懂是二进制独有的浪漫——一篇博客学懂文件操作(C语言)

    目录 一、为什么使用文件 二、什么是文件 2.1程序文件 2.2数据文件 2.3文本文件和二进制文件 2.4文件名 三、文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 3.3文件的顺序读写函数 3.3.1流的概念 3.3.2输入输出的概念  3.3.3函数操作 3.4文件的随机读写函数 3.4.1fseek 3.4.2 fte

    2024年02月06日
    浏览(31)
  • 011集:复制文件(包括exe、 jpg、png、Word、Excel和PPT等二进制文件)—python基础入门实例

            在文本文件的内部以字符形式存储数据,字符是有编码的,例如GBK (简体中文) 、UTF-8等;在二进制文件的内部以字节形式存储数据、没有编码的概念。二进制文件较为常用,例如Windows中的exe、图片 (jpg、png等),以及Word、Excel和PPT等文件。 下面给出一个jpg图片示例。

    2024年01月17日
    浏览(32)
  • 前端:JS:将图片转为二进制与其他文本传入后端

    在前端,可以将图片转换为二进制数据,并将其与其他文本字符串一起发送到后端。一种常见的方法是将所有数据组合为一个 FormData 对象,然后通过 AJAX 或 Fetch API 将其发送给后端。以下是一个示例: 解释 : 当文件输入框内容发生变化时,会触发 change 事件。然后,它会读

    2024年04月26日
    浏览(28)
  • C++十进制与二进制之间的转换

    一般采用\\\"除2取余,逆序排列\\\"法: 也就是将一个十进制数不断除2,将每次得到的余数倒序从后向前排列。 拿求救信号6举个例子: 6/2=3……0  末位就是0 3/2=1……1   前一位就是1 1/2=0……1  再前一位就是1 再画个图辅助理解,这回试试100: 所以100的二进制表达就是1100100 那用

    2024年02月08日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包