文件读写的步骤:

1、包含的头文件:#include <fstream>//使用文件流进行操作

2、创建流

3、打开文件(文件和流关联)

4、读写 (写操作:<<,put( ), write( ) 读操作: >> , get( ),getline( ), read( ))

5、关闭文件:把缓冲区数据完整地写入文件, 添加文件结束标志, 切断流对象和外部文件的连接

---------------------------

文件的读写:

1、文本文件的读写:

方法:

一次性读写若干字符

1)使用运算符<< 和 >>进行读写

功能:

<< 能实现以行为单位写入文件

>> 不能一行为单位读入内存,总是以空格、Tab、回车结束,而是以单词为单位

//函数功能:使用<< ,写入文件一行字符
#include <fstream>
#include <iostream>
using namespace std;
void main()
{ofstream OpenFile("file.txt");//file.txt不需要提前建立存在,执行程序时发现没有此文件会
//自己创建if (OpenFile.fail()){cout << "打开文件错误!" << endl;exit(0);}OpenFile << "abc def ghi";OpenFile.close();system("pause");
}

程序执行结果:文件中写入内容:abc def ghi

                                  

//函数功能:使用>>,从文件读入一个单词
#include <fstream>
#include <iostream>
using namespace std;
void main()
{const int len = 20;char str[len];ifstream OpenFile("file.txt");//必须是实现建立好已经存在的文件,否则打开文件错误if (OpenFile.fail()){cout << "打开文件错误!" << endl;exit(0);}OpenFile >> str;  //此处并不是让你输入,而是从文件中读取cout << str << endl;OpenFile.close();system("pause");
}

运行结果:str的内容为abc,而不是abc def ghi(见空格停止)

如果file.txt该文本中为空,则执行程序的结果为左图(表明文中第15行并不是类似于cin的从键盘输入操作,而此处是从文件中读取)。    如果file.txt该文本中是第一个程序执行后的结果,该程序执行结果如右图。

                                                        

2)使用运算符<<(写)和getline()进行读写

功能:

<<:以行为单位输入文件

getline():以行为单位 读入内存,能一次读入一行

函数原型:istream &getline( char *buffer, streamsize num );

功能:getline( )函数用于从文件读取num-1个字符到buffer(内存)中,直到下列情况发生时,读取结束:

1):num - 1个字符已经读入

2):碰到一个换行标志

3):碰到一个EOF

/*getline()的原型是istream& getline ( istream &is , string &str , char delim );会生成一个包含一串从输入流读入的字符的字符串,
 直到以下情况发生会导致生成的此字符串结束:1)到文件结束,2)遇到函数的定界符,3)输入达到最大限度。
getline(<字符数组chs>,<读取字符的个数n>,<终止符>)*/

//使用运算符<<(写)和getline()进行读写
#include <fstream>
#include <iostream>
using namespace std;
void main()
{  const int len=20;  char str[len];  ifstream OpenFile("file.txt");  if (OpenFile.fail())  {  cout<<"打开文件错误!"<<endl;  exit(0);  }  OpenFile.getline(str,20);  cout<<str<<endl;  OpenFile.close();  system("pause");
} 

运行结果:str的内容为abc def ghi (一直把一行读完)

------使用读取整行文本的函数。全局函数 getline() 可以用于此目的,它也是字符串库的一部分。其用法如下。

istream& getline (istream& is, string& str, char delim = '\n');

该函数从流 is 中读取一行文本,并将其存储到字符串变量 str 中。该函数具有一个可选的形参 delim,用于标记要读取的行的结尾。分隔字符被从流中移除并丢弃。如果在没有第 3 个形参的情况下调用 getline,则分隔符被认为是行尾字符 '\n'。

第一个参数 is,必须是 istream 类的一个对象。它也可以是 istringstream、ifstream 或 fstream 类中的任何对象(如果传递了 fstream 对象,则必须打开它才能输入)。返回的值是对刚刚读取的输入流的引用。这允许测试返回值以确定调用的成功或失败,如下面的代码段所示:

string str;
if (getline(inputstream, str))
{//读取一行并存储到str中cout << str << endl;
}
else
{//出现错误或到达文件末尾
}

或者,也可以忽略返回值并在调用后的语句中测试流:

string str;
getline(inputstream, str);
if (inputstream)
{//读取一行并存储到str中cout << str << endl;
}
else
{//出现错误或到达文件末尾
}

使用 getline 函数逐行读取文件,从而保留了单词之间的白色空格:

// This program uses the getline function to read a line of information from the file.
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{// Variables needed for file inputfstream nameFile;string input;// Open the filenameFile. open ("murphy.txt" , ios::in);if (!nameFile){cout << "File open error!" << endl;return 0;}// Read first line of the filegetline(nameFile, input);//该函数从流 nameFile 中读取一行文本,并将其存储到字符串变量 input 中while (nameFile){//If successful, print line and read another linecout << input << endl;getline(nameFile, input);}// Close the filenameFile.close();return 0;
}

提前建立的murphy.txt文档内容如左边;   程序执行结果如右边。

                  

由于 getline 函数的第 3 个参数在此程序中被省略了,所以它的默认值是 \n。有时可能想要指定另一个分隔符。例如,来看一个包含多个名称和地址的文件,比如存在一个addresses.txt,其内部格式如下:

可以将该文件看成是由 3 个记录组成的。记录是关于单个项目的完整信息集。另外,文件中的记录由 3 个字段组成:

  • 第一个字段就是某人的名字;
  • 第二个字段是某人的街道地址或邮政信箱号码;
  • 第三个字段包含某人的城市、州和邮政编码。

PS:请注意,每个字段以 $ 字符结尾,每个记录以 \n 字符结尾。下面的程序演示了如何使用 getline 函数来检测 $ 字符:

// This file demonstrates the getline function with a user-specified delimiter.
#include <iostream>
#include <string>
#include <fstream>
using namespace std;int main()
{// Variable needed to read filestring input;// Open the file.fstream dataFile ("addresses.txt", ios::in);if (!dataFile){cout << "Error opening file.";return 0;}// Read lines terminated by '$'' sign and outputgetline(dataFile, input, '$');//$用于标记要读取的行的结尾while (!dataFile.fail()) //判断是否存在有效的输入流{cout << input << endl;  //输出检测到的第一个$之前的内容  并进行换行getline(dataFile, input, '$');//再次调用getline函数}// Close the filedataFile.close ();return 0;
}

此程序输出结果为:

请注意,标记每个记录结尾的 \n 字符也是输出的一部分。它们会在屏幕上打印出额外的空白行,将记录分开。

另外,使用 $ 之类的可打印字符分隔文件中的信息时,请务必选择一个实际上不会出现在信息本身中的字符。由于任何人的姓名或地址含有 $ 字符都是值得怀疑的,所以在这里它是一个可接受的分隔符。但如果文件中包含美元金额,则应该选择另一个分隔符。

while(getline())见链接:

https://mp.csdn.net/console/editor/html/104759846

一次读写一个字符:

使用get( )和put( )函数

函数声明:istream& get(char &c);

//使用 get( )函数 把字符1输入到文件
#include <fstream>
#include <iostream>
using namespace std;
void main()
{  char ch='1';  ofstream OpenFile("file.txt");  //该file.txt文档不需要提前建立,检测到没有此文件会自动创建if (OpenFile.fail())  {  cout<<"打开文件错误!"<<endl;  exit(0);  }  OpenFile.put(ch);  OpenFile.close();  system("pause");
}  

运行结果:把字符1写入文件

//函数功能:使用 put( )函数 把文件中第一个字符输入内存
#include <fstream>
#include <iostream>
using namespace std;
void main()
{  char ch;  ifstream OpenFile("file.txt");  //需要提前存在file.txtif (OpenFile.fail())  {  cout<<"打开文件错误!"<<endl;  exit(0);  }  OpenFile.get(ch);  cout<<ch;  OpenFile.close();  system("pause");
}  

运行结果:把字符1从文件中读到ch(内存)中

第15行不加<<endl输出结果为左图。   加入输出结果如右图。  PS:就是一个换行的功能

                        

2、二进制文件的读写:

1)使用运算符get( ) 和 put( )读写一个字节

功能:

get( ) :在文件中读取一个字节到内存

函数原型:ifstream &get(char ch)

put( ) :在内存中写入一个字节到文件

函数原型:ofstream &put(char ch)

//功能:把26个字符写入文件中
#include <fstream>
#include <iostream>
using namespace std;
void main()
{  char ch='a';  ofstream OpenFile("file.txt",ios::binary);  //file.txt此文档无需提前建立好,检测到不存在会自动进行创建if (OpenFile.fail())  {  cout<<"打开文件错误!"<<endl;  exit(0);  }  for (int i=0;i<26;i++)  {  OpenFile.put(ch);  ch++;  }  OpenFile.close();  system("pause");
}  

运行结果:文件内容为abcdefghijklmnopqlst...z

                       

//功能:把文件中的26个字母读入内存
#include <fstream>
#include <iostream>
using namespace std;
void main()
{  char ch;  ifstream OpenFile("file.txt",ios::binary); //file.txt需要提前建立存在 ,否则打开文件错误if (OpenFile.fail())  {  cout<<"打开文件错误!"<<endl;  exit(0);  }  while (OpenFile.get(ch))  cout<<ch;  OpenFile.close();  system("pause");
}  

运行结果:ch依次为abc...z         PS:加入换行符<<endl的不同输出结果。

                                                              

2)使用read()和write()进行读写

  read( ):

功能:从文件中提取 n 个字节数据,写入buf指向的地方中

函数声明:istream &  read ( char * buf ,  int  n ) ;

write( ):

功能:把buf指向的内容取n个字节写入文件

函数声明:ostream & ostream :: write ( char * buf ,  int  n ) ;

参数说明:buf表示要写入内存的地址,传参时要取地址。n表示要读入字节的长度

注意:1):该函数遇到空字符时并不停止,因而能够写入完整的类结构

2):第一个参数一个char型指针(指向内存数据的起始地址),与对象结合使用的时候,要在对象地址之前要char做强制类型转换。

//函数功能:使用write( )函数,一次从内存向文件写入一行数据
#include <fstream>
#include <iostream>
using namespace std;
void main()
{  char ch[12]="12 3 456 78";  ofstream OpenFile("file.txt");  //不需要提前建立file.txt文件,检测到不存在会自动建立,如果提前存在,会覆盖掉原来的file.txt重新建立一个。if (OpenFile.fail())  {  cout<<"打开文件错误!"<<endl;  exit(0);  }  OpenFile.write(ch,12);  OpenFile.close();  system("pause");
}  

运行结果:文件内容12 3 456 78

将OpenFile.write(ch,12)改变参数为OpenFile.write(ch,8),程序执行结果如右图只读取8个字节长度。

               

//函数功能:使用read()函数从文件中提取 n 个字节数据,写入buf指向的地方中
#include <fstream>
#include <iostream>
using namespace std;
void main()
{  char ch[12];  ifstream OpenFile("file.txt");  //需要提前存放好数据文档if (OpenFile.fail())  {  cout<<"打开文件错误!"<<endl;  exit(0);  }  OpenFile.read(ch,12);  cout<<ch;  OpenFile.close();  system("pause");
}  

原始建立的文件为:

此种情况原始文件本来就存在一行:

OpenFile.read(ch,12);此中条件下的两种结果:(因为是按照字节读取,整行读取,所以整行数据并未拆分)

      

          

将原始文件增加为两行:

OpenFile.read(ch,12);此中条件下的两种结果:

                 

             

没有读取第二行文本,因为字节数12跟8在限制。

                 

------PS:

1、程序不再使用文件时,为什么要关闭文件?

因为:1)文件缓冲区是一块小的内存空间.

            2)操作系统限制同时打开的文件数量 

注意:close ( ) 函数关闭文件,但流对象仍然存在。

2、文件的默认打开方式为文本文件,要是想以二进制的方式处理,在打开时要用 ios::binary 显式声明。

3、针对文本文件操作时,get函数和>>的区别:

区别:在读取数据时,get函数包括空白字符(遇空白字符不停止读取)

>>在默认情况下拒绝接受空白字符(遇到空白符停止读取)

4、判断文件是否打开的方法:

//判断文件是否打开的方法:
if (OpenFile)
{  cout<<"打开文件失败!";  exit(0);
}
if (OpenFile.fail())
{  cout<<"打开文件错误!"<<endl;  exit(0);
}  

5、判断文件是否结束的方法:

//方法1)使用成员函数eof()可以检测到这个结束符,如果非0表示文件结束。while (!OpenFile.eof())  {  //文件结束时的代码  }  
//2)使用流直接检测,如果为0表示文件结束
while (!OpenFile)  {  //文件结束时的代码  }  
//3)使用get函数,读取最后一个结束符时,返回0.读取正常情况下,返回1,并把读取的字符放到ch中
while ( (OpenFile.get(ch) )!=EOF)  {  //成功时候的代码  }  

文本文件的读写常使用的方法:使用<<写入文件,使用getline 和 >> 读到内存

二进制文件的读写常使用的方法:使用istream 类的成员函数read 和write 来实现,

这两个成员函数的原型为:

istream& read(char *buffer,int len);
ostream& write(const char * buffer,int len);   

上述参数说明:字符指针 buffer 指向内存中一段存储空间。len 是读/写的字节数。

与对象结合写入二进制文件时:

//write函数调用语句:
输出文件流对象名.write((char*)& 对象名,sizeof(<对象所属类名>));
输出文件流对象名.write((char*)& 对象数组名[下标],sizeof(<对象所属类名>));  
//read函数调用语句:
输入文件流对象名.read((char*)& 对象名,sizeof(<对象所属类名>));
输入文件流对象名.read((char*)& 对象数组名[下标],sizeof(<对象所属类名>));  

PS:gcount()函数经常和read函数配合使用,用来获得实际读取的字节数。

//二进制文件的随机读写
#include <iostream>
#include <fstream>
using namespace std;
int main(void)
{  //写文件:二进制存储1234  int writeNum1 = 1;  int writeNum2 = 2;  int writeNum3 = 3;  int writeNum4 = 4;  ofstream fout("test.txt", ios::out | ios::binary);  fout.write(reinterpret_cast<char *>(&writeNum1), sizeof(int));  fout.write(reinterpret_cast<char *>(&writeNum2), sizeof(int));  fout.write(reinterpret_cast<char *>(&writeNum3), sizeof(int));  fout.write(reinterpret_cast<char *>(&writeNum4), sizeof(int));  fout.close();  //读文件  ifstream fin("test.txt",ios::in | ios::binary);  if (!fin.good())  {  cout<<"文件打开错误"<<endl;    exit(0);  }  int readNum = 0;  //第一次输出:从第一个数字输出,结果是1 2 3 4  fin.seekg(0,ios::beg);  while (fin.peek() != EOF)  {  fin.read(reinterpret_cast<char*>(&readNum), sizeof(int));  cout<<readNum<<" ";  }  cout<<endl;  //第二次输出:从第三个数字输出,结果是3 4 fin.seekg(2 * sizeof(int),ios::beg);//游标移动的次数 = 需要处理数的个数 × int占的字节数  while (fin.peek() != EOF)  {  fin.read(reinterpret_cast<char*>(&readNum), sizeof(int));  cout<<readNum<<" ";  }  cout<<endl;  fin.close();  system("pause");  return 0;
}  

C++:文件操作2 文本文件和二进制文件的读写相关推荐

  1. C语言基础14——文件操作。文本文件或二进制文件读写。通讯录的改造。文件缓冲区讲解

    目录 为什么使用文件? 什么是文件? 文件的打开和关闭 文件指针 文件的打开和关闭 文件的打开方式 流 重定义文件 文件流 文件的顺序读写 以字符形式读写文本文件 fputc()函数 fgetc()函 ...

  2. 高级语言程序设计II 实验报告三c++使用文本文件和二进制文件的读写比较两者的区别和优劣...

    高级语言程序设计II 实验报告三 姓名:许恺 学号:2014011329 日期:2015年5月25日 1. 实验目的 通过在c++中使用文本文件和二进制文件的读写比较两者的区别和优劣,同时锻炼c++的 ...

  3. 第十一章 文件操作_C语言实现文件复制功能(包括文本文件和二进制文件)

    文件的复制是常用的功能,要求写一段代码,让用户输入要复制的文件以及新建的文件,然后对文件进行复制.能够复制的文件包括文本文件和二进制文件,你可以复制1G的电影,也可以复制1Byte的txt文档. 实现 ...

  4. c语言实现指定路径文件读取_C语言实现文件复制功能(包括文本文件和二进制文件)...

    文件的复制是常用的功能,要求写一段代码,让用户输入要复制的文件以及新建的文件,然后对文件进行复制.能够复制的文件包括文本文件和二进制文件,你可以复制1G的电影,也可以复制1Byte的txt文档.实现文 ...

  5. python087(文件—文件概念以及文本文件和二进制文件的区别)

    文件的概念和作用 计算机的文件,就是存储某种长期储存设备上的一段数据 长期存储设备包括:硬盘.U盘.移动硬盘.光盘... 文件的作用 将数据长期保存下来,在需要的时候使用 CPU在使用数据时,要先将硬 ...

  6. java文件处理(一)--文本文件转二进制文件

    文本处理 1.读取二进制数据流 2.二进制文本打印 一个文件在计算机内是以二进制的形式储存的.打开一个文件时,计算机会根据文件的类型对文件就行解析,最后得到了我们所看到的文字,图片,视频等.于是我就想 ...

  7. 【C 语言】文件操作 ( 按照单个字符的方式读写文件 | fgetc 函数 | fputc 函数 )

    文章目录 一.文件名路径设置 二.文件打开方式 三.fputc 函数 | 按照字符方式写文件 1.fputc 函数 2.代码示例 四.fgetc 函数 | 按照字符方式读文件 1.fgetc 函数 2 ...

  8. 【C 语言】文件操作 ( 读文本文件 | 文本加密解密 | fgets 函数 | fputs 函数 )

    文章目录 一.从文件中读取多行文本 二.文本文件加密 三.文本文件解密 一.从文件中读取多行文本 首先 , 以读的方式打开文件 ; // 打开一个文件 , 以读的方式 // r : 使用读的方式打开一 ...

  9. Python文件操作-写文本文件

    本关任务:从键盘输入数据,保存到文本文件当中. 相关知识 为了完成本关任务,你需要掌握写文本文件的方法. 写文本文件 python文件对象提供了两个"写"方法: write() 和 ...

最新文章

  1. 帮奶牛找对象?华为云AI黑科技大揭秘
  2. 自定义控件-侧边菜单SlidingMenu(滑动菜单)
  3. Windows消息和事件的区别 VC++解惑
  4. 【Linux网络编程】无连接和面向连接协议
  5. skype自动回复_如何在Windows 10上阻止Skype自动启动
  6. 3dvary灯光材质为什么不亮_关机后电脑灯光闪瞎狗眼?在这里关闭它
  7. 定时更换超级连接的代码
  8. 压缩UI深度的代码实现
  9. 大数据可视化有哪些优势
  10. 【乌拉喵.教程】TestBench仿真给输出脚赋值引起的问题
  11. 酒店消防安全知识培训PPT模板
  12. 华为metebook电脑如何修改应用商店中新应用的默认安装路径
  13. 信息安全技术(俞承杭)期末复习
  14. 用友华表Cell组件/插件注册
  15. 拥抱认知革命:区块链时代已至,临渊羡鱼不若自我革新
  16. 修复苹果电脑运行过程中出现的声音、触摸板失灵、键盘错键、光标乱窜问题
  17. 北京大学计算机学院刘利,信息科学学院 科研动态 深化新文科计算机教学改革,实施分类分层次教学体系研讨会在京召开...
  18. 程序猿生存指南-41 冬日归乡
  19. 怪物猎人ol服务器维护,腾讯宣布怪物猎人OL停运 12月31日正式关服
  20. zk4元年拆解_科比zk4复刻前掌没有zoom zk4选秀日复刻中底拆解测评

热门文章

  1. C++ #define(宏定义)的使用
  2. C++ .h(头文件) 与 .cpp(源文件) 的使用
  3. Android - 下载别人的android demo 运行的时候加载很久问题处理
  4. RxJava 过滤操作符 distinct 和 distinctUntilChanged
  5. android 创建 file 文件,文本 并写入内容
  6. shell eval命令
  7. VS各种错误集成总结,持续更新
  8. Linux 用户行为日志记录
  9. MySQL 学习笔记(16)— 子查询(单行单列、一行多列、多行多列、 ALL、ANY、SOME 运算符、EXISTS 操作符)
  10. 源文件封装为IP的步骤