一、文件的输入输出

头文件fstream定义了三个类型支持文件IO:ifstream从给定文件读取数据、ofstream向一个给定文件写入数据、fstream读写给定数据。这些类型与cin和cout的操作一样,我们可以用IO操作符来读写文件,还可以用getline从一个ifstream读取数据。

1、getline()函数

getline的函数原型为:

  1. istream& getline(istream&  is, string& str, char delim);
  2. istream& getline(istream&& is, string& str, char delim);
  3. istream& getline(istream&  is, string& str);
  4. istream& getline(istream&& is, string& str);

通常我们使用getline函数读取一整行,该函数接受一个输入流和一个string对象,函数从给定的输入流中读取内容,直到遇到换行符为止,然后将所读的内容存入到个string对象中。

另外,当函数为istream& getline (istream& is, string& str, char delim);形式时,函数遇到delim也会停止。

2、使用文件流对象

当我们想要读入一个文件时,可以定义一个文件流对象,并将对象与文件相关联起来,每一个文件流类都定义了一个名为open的成员函数,完成一系列系统相关的操作。

open函数的原型为:

  1. void open (const   char* filename,  ios_base::openmode mode = ios_base::out);
  2. void open (const string& filename,  ios_base::openmode mode = ios_base::out);

文件模式(mode)有一下几种:

  1. ofstream outfile("E:\\out.txt", ofstream::app);

上述代码打开out.txt文件,如果不存在,系统会创建此txt文件,并且定位到文件末尾。
打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此操作。

例:从hello.txt文件中读取数据并写入到out.txt中

  1. #include "stdafx.h"
  2. #include <vector>
  3. #include <string>
  4. #include <fstream>
  5. #include <iostream>
  6. using namespace std;
  7. int _tmain(int argc, _TCHAR* argv[])
  8. {
  9. ifstream myfile("E:\\hello.txt");
  10. ofstream outfile("E:\\out.txt", ofstream::app);
  11. string temp;
  12. if (!myfile.is_open())
  13. {
  14. cout << "未成功打开文件" << endl;
  15. }
  16. while(getline(myfile,temp))
  17. {
  18. outfile<<temp;
  19. }
  20. myfile.close();
  21. return 0;
  22. }

二、string流

string头文件定义了三个类型来支持内存IO,istringstream向string写入数据,ostringstream从string读取数据,stringstream既可从string读取数据也可向string写数据,就像string是一个IO流一样。

1、istringstream的用法

  1. #include "stdafx.h"
  2. #include <string>
  3. #include <sstream>    //使用istringstream所需要的头文件
  4. #include <iostream>
  5. using namespace std;
  6. int _tmain(int argc, _TCHAR* argv[])
  7. {
  8. string str = "I am a boy";
  9. istringstream is(str);
  10. string s;
  11. while (is >> s)
  12. {
  13. cout << s << endl;
  14. }
  15. return 0;
  16. }

输出结果为:

I

am

a

boy

例:编写程序,将来自一个文件中的行保存在一个vector<string>中,然后使用istringstream从vector读取数据元素,每次读取一个单词。

  1. #include "stdafx.h"
  2. #include <vector>
  3. #include <string>
  4. #include <fstream>
  5. #include <sstream>
  6. #include <iostream>
  7. using namespace std;
  8. int _tmain(int argc, _TCHAR* argv[])
  9. {
  10. vector<string> vec;
  11. ifstream myfile("E:\\hello.txt");
  12. string temp;
  13. if (!myfile.is_open())
  14. {
  15. cout << "未成功打开文件" << endl;
  16. }
  17. while(getline(myfile,temp))
  18. {
  19. vec.push_back(temp);
  20. }
  21. for (auto it = vec.begin(); it != vec.end(); it++)
  22. {
  23. cout << *it << endl;
  24. }
  25. cout << "-----------------使用istringstream------------------------" << endl;
  26. for (auto it = vec.begin(); it != vec.end(); it++)
  27. {
  28. istringstream record(*it);
  29. string s;
  30. while (record >> s)
  31. cout << s << endl;
  32. }
  33. return 0;
  34. }

运行结果如图所示:

//下述论述转自www.cndev-lab.com ,程序作者:管宁

  1. #i nclude <iostream>
  2. #i nclude <sstream>
  3. using namespace std;
  4. int main()
  5. {
  6. istringstream istr;
  7. istr.str("1 56.7",);
  8. //上述两个过程可以简单写成 istringstream istr("1 56.7");
  9. cout << istr.str()<<endl;
  10. int a;
  11. float b;
  12. istr>>a;
  13. cout<<a<<endl;
  14. istr>>b;
  15. cout<<b<<endl;
  16. system("pause");
  17. }

  上例中,构造字符串流的时候,空格会成为字符串参数的内部分界,例子中对a,b对象的输入"赋值"操作证明了这一点,字符串的空格成为了整型数据与浮点型数据的分解点,利用分界获取的方法我们事实上完成了字符串到整型对象与浮点型对象的拆分转换过程。

  str()成员函数的使用可以让istringstream对象返回一个string字符串(例如本例中的输出操作(cout<<istr.str();)。

2、ostringstream的用法

 ostringstream同样是由一个string对象构造而来,ostringstream类向一个string插入字符。 
 ostringstream的构造函数原形如下:

  1. ostringstream::ostringstream(string str);

//下述论述转自www.cndev-lab.com ,程序作者:管宁

  1. #i nclude <iostream>
  2. #i nclude <sstream>
  3. #i nclude <string>
  4. using namespace std;
  5. int main()
  6. {
  7. ostringstream ostr;
  8. //ostr.str("abc");//如果构造的时候设置了字符串参数,那么增长操作的时候不会从结        尾开始增加,而是修改原有数据,超出的部分增长
  9. ostr.put('d');
  10. ostr.put('e');
  11. ostr<<"fg";
  12. string gstr = ostr.str();
  13. cout<<gstr;
  14. system("pause");
  15. }

在上例代码中,我们通过put()或者左移操作符可以不断向ostr插入单个字符或者是字符串,通过str()函数返回增长过后的完整字符串数据,但值 得注意的一点是,当构造的时候对象内已经存在字符串数据的时候,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长。

c++学习笔记—c++对txt文件的读取与写入的更多相关文章

  1. c# txt文件的读取和写入

    我们在工程实践中经常要处理传感器采集的数据,有时候要把这些数据记录下来,有时候也需要把记录下来的数据读取到项目中.接下来我们用C#演示如何对txt文件进行读写操作.我们要用到StreamReader  ...

  2. C# txt文件的读取与写入

    C#创建记事本方法一://创建对象 FileStream stream = new FileStream(@"d:\aa.txt",FileMode.Create);//fileM ...

  3. 《程序实现》从xml、txt文件里读取数据写入excel表格

    直接上码 import java.io.BufferedReader; import java.io.DataInputStream; import java.io.File; import java ...

  4. (三)C#关于txt文件的读取和写入

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...

  5. c++对txt文件的读取与写入

    转自:http://blog.csdn.net/lh3325251325/article/details/4761575 #include <iostream> #include < ...

  6. c#中对txt文件的读取与写入,针对二维数组

    class Program { ; ; static string[,] str = new string[ROW, COL]; static void Main(string[] args) { R ...

  7. python学习笔记(六)文件夹遍历,异常处理

    python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...

  8. java 学习笔记之 流、文件的操作

    ava 学习笔记之 流.文件的操作 对于一些基础的知识,这里不再过多的解释, 简单的文件查询过滤操作 package com.wfu.ch08; import java.io.File; import ...

  9. Java NIO 学习笔记(四)----文件通道和网络通道

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

随机推荐

  1. Android ListView实现单击item出现删除按钮以及滑动出现删除按钮

    我自己一个人弄的公司的产品客户端,所以还是想记录下来以免忘记或者丢失... 在我的上一篇博文(点击打开链接)是一个文件管理的东西,基础组件也是ListView所以在此只是改动一下而已. 单击: 点击出 ...

  2. 文本编辑工具(sublime text 2)

    学习地址: http://www.iplaysoft.com/sublimetext.html 下载地址:http://www.sublimetext.com

  3. git中报unable to auto-detect email address 错误的解决拌办法

    昨天刚配置好的git,今天刚要commit一些修改,就遇到了这个问题** Please tell me who you are. Run git config --global user.email ...

  4. Git -- 新增分支添加新功能

    软件开发中,总有无穷无尽的新的功能要不断添加进来. 添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合 ...

  5. Linux系统设置及基本操作

    下面是Linux系统的基本的使用以及系统操作命令,目录结构等等! linux系统的操作方式 图形界面:RHEL6默认使用GNOME桌面环境 伪字符终端:  图形桌面环境中的伪字符终端 对应程序: gn ...

  6. 深入探讨:MySQL数据库MyISAM与InnoDB存储引擎的比较

    From: http://www.jb51.net/article/37766.htm MySQL有多种存储引擎,MyISAM和InnoDB是其中常用的两种.这里介绍关于这两种引擎的一些基本概念(非深 ...

  7. MySQL时间戳时间

    MySQL中: now():获取当前时间:例:SELECT now(); unix_timestamp():将时间转换为时间戳:例: SELECT unix_timestamp(now());

  8. matlabr2015b安装教程

    R2015b MATLAB破解版安装教程 MATLAB和Mathematica.Maple并称为三大数学软件.它在数学类科技应用软件中在数值计算方面首屈一指.MATLAB可以进行矩阵运算.绘制函数和数 ...

  9. 软件设计模式之模板方法模式(JAVA)

    什么是模板方法模式? 定义一个操作中算法的骨架,而将这些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 好抽象的概念啊,文绉绉的东西就是不讨人喜欢,下面我 ...

  10. thinkphp并发 阻塞模式与非阻塞模式

    结构代码 public function index(){ $fp = fopen("lock.txt", "w+"); if(flock($fp,LOCK_E ...