一、文件的输入输出

头文件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. Mysql 配置文件和目录的合理分配

    记得给权限呀, 权限呀, 都是泪 多实例 单实例 配置文件 [client] port = 3301 socket = /data/mysql3301/data/mysqld3301.sock [my ...

  2. 【WPF】WPF DataGrid List数据源 双向绑定通知机制之ObservableCollection使用以及MultiBinding 的应用

    以下代码实现了DataGrid的简单绑定List数据源 重点要提一下的是,绑定List数据源,但是不能直接用List.比如下面的代码,使用List<GridItem>只能实现数据修改的绑定 ...

  3. SpagoBI 教程 Lesson 2: OLAP with JPIVOT

    SpagoBI Lesson 2: OLAP with JPIVOT Online Analytical Processing Online Analytical Processing (OLAP) ...

  4. CSS的块级元素和内联元素,以及float

    说明:之前有一点搞错了,就是float其实是浮动起来,其它元素会位于它的底层. 最近在系统地学习HTML5,感觉补上了好多缺失的知识. 例如: 锚点定位其实可以通过 id 来实现: CSS 使用 !i ...

  5. 又看了半天的pdf格式的js方面的书,感觉受益匪浅啊,只会一点操作的我,要学好理论

    又看了半天的pdf格式的js方面的书,感觉受益匪浅啊,只会一点操作的我,要学好理论

  6. 【转】在64位windows下使用instsrv.exe和srvany.exe创建windows服务

    本文转自:https://www.iflym.com/index.php/computer-use/201205020001.html 在32位的windows下,包括windows7,windows ...

  7. thinkphp模板中使用方法

    1.php中的方法使用 <?php $var_num = "13966778888"; $str = substr_replace($var_num,'*****',3,5) ...

  8. TensorFlow-GPU:查看电脑显卡型号是否支持CUDN,以及相关软件下载与介绍

    1.显卡(GPU)是否支持CUDN https://developer.nvidia.com/cuda-gpus 2.了解基础知识 1)CUDA(Compute Unified Device Arch ...

  9. Springboot学习笔记(七)-集成Redis

    redis下载地址 添加依赖 <dependencies> <dependency> <groupId>org.springframework.boot</g ...

  10. js pjax 和window.history.pushState,replaceState

    原文:http://blog.linjunhalida.com/blog/pjax/ github:https://github.com/defunkt/jquery-pjax 什么是pjax? 现在 ...