c++学习笔记—c++对txt文件的读取与写入

一、文件的输入输出

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

1、getline()函数

getline的函数原型为:

[cpp] view plaincopy

  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函数的原型为:

[cpp] view plaincopy

  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)有一下几种:

[cpp] view plaincopy

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

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

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

[cpp] view plaincopy

  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的用法

[cpp] view plaincopy

  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读取数据元素,每次读取一个单词。

[cpp] view plaincopy

  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 ,程序作者:管宁

[cpp] view plaincopy

  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的构造函数原形如下:

[cpp] view plaincopy

  1. ostringstream::ostringstream(string str);

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

[cpp] view plaincopy

  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()函数返回增长过后的完整字符串数据,但值 得注意的一点是,当构造的时候对象内已经存在字符串数据的时候,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长。

时间: 2024-12-11 09:51:42

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

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

直接上码 import java.io.BufferedReader; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; impo

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

#include <iostream> #include <iomanip> #include <fstream> using namespace std; int main(){ char buffer[256]; ifstream myfile ("c://a.txt"); ofstream outfile("c://b.txt"); if(!myfile){ cout << "Unable to ope

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

class Program { public static int ROW = 5; public static int COL = 6; static string[,] str = new string[ROW, COL]; static void Main(string[] args) { Read(); Write(); } public static void Read() { string[] a; StreamReader sr = new StreamReader("D:\\im

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

ava 学习笔记之 流.文件的操作 对于一些基础的知识,这里不再过多的解释, 简单的文件查询过滤操作 package com.wfu.ch08; import java.io.File; import java.io.FilenameFilter; public class Test1 { public static void main(String[] args) { File file=new File("F:\\2017-2018-1\\javase"); // //获取该目录下

Unix文件系统学习笔记之二: 文件描述符、inode和打开文件表

Unix文件系统学习笔记之二: 文件描述符.inode和打开文件表 系统盘上数据的布局 文件系统无非是关于数据在磁盘上的组织以及存储空间管理的,为此,首先需要知道磁盘上数据的总体布局方式.以Unix为例,最重要的一张表如下: Unix 进程管理中和用户文件.io 最相关的数据结构:usr 数据结构 The procstructure does not record information related to file access.  However the userstructure con

Lua学习笔记9:多文件

一 终端中执行多个文件:-l 加入在文件一中定义了一个变量,在另一文件中输出这个变量,代码如下: --file1.lua num = 100 --file2.lua print(num) 终端输入(注意:不是lua命令行): lua -lfile1 -lfile2 注意:不要加上文件后缀名.lua 二 命令行中加载文件 --lib.lua function norm(x, y) local n2 = x^2 + y^2 return math.sqrt(n2) end function twic

【改自lg2lh】EZ-USB 68013 学习笔记--设备信息安装文件CyUSB.inf详细说明

首先要明白一个INF文件的基本结构:INF由节组成,即一个个段组成.每个段的功能不一样.(大部分书上把这个段叫作"节") [Version]段:主要用说明版本信息的. [Strings]段:字符串信息,用于常量定义,用于显示.凡在其他段中出现的%XXXX%(就是两个百分号夹着一组字母),则对应的就会在Strings段里对应着它的一个字符串. [SourceDisksNames]段:定义安装源文件所在磁盘,一般为1,表示在第一个磁盘.此节可无. [SourceDiskFiles]段:驱动

Linux 程序设计学习笔记----动手编写makefile文件

Befroe Beginning. 之前定了暑假的plan ,关于Linux的书籍现在在看的是ALP和Linux高级程序设计(杨宗德)第三版.在计划中的是Linux高级环境编程. 现在开始关于Linux程序设计的第一篇学习笔记. 本来打算把名字写成教程,不过觉得自己完全是新手在自学,还是写学习笔记比较负责和适合. 希望可以一起学习进步. 引入 首先我们假设这样一个场景.我们有一个程序包含了三个文件,分别是源码文件main_plus,c和function_plus.c以及头文件mydefine_p

《鸟哥的Linux私房菜》学习笔记(1)——文件与目录

在Linux中,任何设备都是文件,不仅如此,连数据通信的接口也有专门的文件负责.可以说,一切皆文件,目录也是一种文件,是路径映射.因此,文件系统是Linux的基础. 一.文件与目录管理命令 1.ls(list)--查看文件与目录命令 在linux中,该命令可能是最多被执行的,因为我们随时要知道文件或者目录的相关信息.ls命令默认显示非隐藏文件的文件名(以文件名进行排序)以及文件名代表的颜色. 命令格式:ls [选项] [目录名] 常用参数: -l(long):列出长字符串,包含文件的属性与权限等