对文件的读写操作是我们在做项目时经常用到的,在网上看了很多博客,结合自身的项目经验总结了一下,因此写了这篇博客,有些地方可能直接从别的博客中复制过来,但是都会注明出处。

一、文件的输入输出

fstream提供了三个类,用来实现c++对文件的操作。(文件的创建、读、写)。

ifstream -- 从已有的文件读入

ofstream -- 向文件写内容

fstream - 打开文件供读写

文件打开模式:

ios::in             只读

ios::out            只写

ios::app            从文件末尾开始写,防止丢失文件中原来就有的内容

ios::binary         二进制模式

ios::nocreate       打开一个文件时,如果文件不存在,不创建文件

ios::noreplace      打开一个文件时,如果文件不存在,创建该文件

ios::trunc          打开一个文件,然后清空内容

ios::ate            打开一个文件时,将位置移动到文件尾

文件指针位置在c++中的用法:

ios::beg   文件头

ios::end   文件尾

ios::cur   当前位置

例子:

file.seekg(0,ios::beg);   //让文件指针定位到文件开头

file.seekg(0,ios::end);   //让文件指针定位到文件末尾

file.seekg(10,ios::cur);   //让文件指针从当前位置向文件末方向移动10个字节

file.seekg(-10,ios::cur);   //让文件指针从当前位置向文件开始方向移动10个字节

file.seekg(10,ios::beg);   //让文件指针定位到离文件开头10个字节的位置

注意:移动的单位是字节,而不是行

常用的错误判断方法:

good()   如果文件打开成功

bad()   打开文件时发生错误

eof()    到达文件尾

以上内容参考自:http://www.cnblogs.com/helinsen/archive/2012/07/26/2609251.html

下面给出一个例子,读取hello.txt文件中的字符串,写入out.txt中:

#include <vector>
#include <string>
#include <fstream>
#include <iostream> using namespace std; int main()
{
ifstream myfile("G:\\C++ project\\Read\\hello.txt");
ofstream outfile("G:\\C++ project\\Read\\out.txt", ios::app);
string temp;
if (!myfile.is_open())
{
cout << "未成功打开文件" << endl;
}
while(getline(myfile,temp))
{
outfile << temp;
outfile << endl;
}
myfile.close();
outfile.close();
return 0;
}

  hello.txt文件中的内容为:

上式程序执行3遍后,out.txt文件中的内容为:

上述代码读取的是string类型的数据,那么对于int型数据该怎么办呢,其实道理差不多,下面举例说明:

#include<iostream>
#include <string>
#include <vector>
#include <fstream> //文件流库函数 using namespace std; int cost[10][10]; int main()
{
int v, w, weight;
ifstream infile; //输入流
ofstream outfile; //输出流 infile.open("G:\\C++ project\\Read\\data.txt", ios::in);
if(!infile.is_open ())
cout << "Open file failure" << endl;
while (!infile.eof()) // 若未到文件结束一直循环
{
infile >> v >> w >> weight;
cost[v][w] = weight;
cost[w][v] = weight;
}
infile.close(); //关闭文件 outfile.open("G:\\C++ project\\Read\\result.txt", ios::app); //每次写都定位的文件结尾,不会丢失原来的内容,用out则会丢失原来的内容
if(!outfile.is_open ())
cout << "Open file failure" << endl;
for (int i = 0; i != 10; ++i)
{
for (int j = 0; j != 10; ++j)
{
outfile << i << "\t" << j << "\t" << cost[i][j] << endl; //在result.txt中写入结果
} }
outfile.close(); return 0;
while (1);
}

  上述代码的功能是读取data.txt文件的数据,注意,此时要求data.txt文件中的数据是三个一行,每个数据用空格隔开,之所以这样做,是因为在许多项目中,比如某为的算法比赛中,根据图的数据构建图的邻接矩阵或者邻接表时,数据都是这样安排的,在上面的代码中v和w代表顶点标号,weight代表边<v,w>的权值,上述代码的功能就是构建由data.txt文件描述的图的邻近矩阵。

data.txt文件的数据如下:

程序运行后,result.txt文件的内容如下:

注意:数据太长,只给出了一部分。

事实上,要求data.txt文件中的数据都是如此排列的要求有点高,如果data.txt文件中有的行有两个数据,有的行有三个数据,有的行有4个数据,上述方法就行不通了,其实改一下上面的代码就可以了,重要的是你要明白什么时候读取的那一行有几个数据,下面举例说明:

假设data.txt文件中的数据如下:

第一行的数据表示,每行有三个数据的有5行,且在前面,每行有两个的数据的有两行,在后面,除第一行外,后面的才是正真的数据,因此读取这些数据的代码如下:

#include<iostream>
#include <string>
#include <vector>
#include <fstream> //文件流库函数 using namespace std; int cost[10][10]; int main()
{
int Num_3,Num_2;
int v, w, weight;
ifstream infile; //输入流
ofstream outfile; //输出流 infile.open("G:\\C++ project\\Read\\data.txt", ios::in);
if(!infile.is_open ())
cout << "Open file failure" << endl; infile >> Num_3 >>Num_2 ; //先读取第一行 while (Num_3 != 0) // 读取3个数据的
{
infile >> v >> w >> weight;
cost[v][w] = weight;
cost[w][v] = weight;
Num_3--;
} while (Num_2 != 0) // 读取3个数据的
{
infile >> v >> w;
cost[v][w] = 100;
cost[w][v] = 100;
Num_2--;
} infile.close(); //关闭文件 outfile.open("G:\\C++ project\\Read\\result.txt", ios::out); //每次写都定位的文件结尾,不会丢失原来的内容,用out则会丢失原来的内容
if(!outfile.is_open ())
cout << "Open file failure" << endl;
for (int i = 0; i != 10; ++i)
{
for (int j = 0; j != 10; ++j)
{
outfile << i << "\t" << j << "\t" << cost[i][j] << endl; //在result.txt中写入结果
} }
outfile.close(); return 0;
while (1);
}

  为方便检验,我们把那些没有指明权值的边(即对应data.txt文件中那些每行只有两个数据的)的权值设为100,上述代码执行结果如下:

结果显示,读取正确。

注意:上面的代码之所以运行成立,是因为每行之间空几行好像并没有影响,比如上面的data.txt中,第一行与第二行之间空1行或者2行都没有关系。

二、string流

以下内容参考自:http://blog.csdn.net/xujian_2014/article/details/42679525

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

  1、istringstream的用法,例子如下:

#include <string>
#include <sstream> //使用istringstream所需要的头文件
#include <iostream>
using namespace std;
int main()
{
string str = "Hello word! I am Lee";
istringstream is(str); //将is绑定到str
string s;
while (is >> s)
{
cout << s << endl;
}
return 0;
}

  上述代码运行结果如下:

这相当于把一个句子拆分成单词,联系到前文提到的从文件中读取string的方法,如果读取到的string对象为一个句子,包含很多单词,那么我们就可以运用这种方法把string对象拆分开来。

2、ostringstream的用法

ostringstream同样是由一个string对象构造而来,ostringstream类向一个string插入字符。

#include <string>
#include <sstream> //使用ostringstream所需要的头文件
#include <iostream>
using namespace std;
int main()
{
ostringstream ostr;
// ostr.str("abc");//如果构造的时候设置了字符串参数,那么增长操作的时候不会从结尾开始增加,而是修改原有数据,超出的部分增长
ostr.put('d');
ostr.put('e');
ostr<<"fg";
string gstr = ostr.str();
cout<<gstr << endl;
return 0;
}

  运行结果如下:

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

夜深了,,,

广州的天气总是边的如此的快,又下雨了,,,

C++读写TXT文件中的string或者int型数据以及string流的用法的更多相关文章

  1. 4.产生10个1-100的随机数,并放到一个数组中 (1)把数组中大于等于10的数字放到一个list集合中,并打印到控制台。 (2)把数组中的数字放到当前文件夹的numArr.txt文件中

    package cn.it.text; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayLis ...

  2. python操作txt文件中数据教程[1]-使用python读写txt文件

    python操作txt文件中数据教程[1]-使用python读写txt文件 觉得有用的话,欢迎一起讨论相互学习~Follow Me 原始txt文件 程序实现后结果 程序实现 filename = '. ...

  3. [转载]C#读写txt文件的两种方法介绍

    C#读写txt文件的两种方法介绍 by 大龙哥 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char ...

  4. Java读写txt文件

    1.Java读取txt文件 1.1.使用FileInputStream: public static String readFile(File file, String charset){ //设置默 ...

  5. C#读写txt文件的两种方法介绍

    C#读写txt文件的两种方法介绍 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出 ...

  6. WPF 读写TxT文件

    原文:WPF 读写TxT文件 文/嶽永鹏 WPF 中读取和写入TxT 是经常性的操作,本篇将从详细演示WPF如何读取和写入TxT文件. 首先,TxT文件希望逐行读取,并将每行读取到的数据作为一个数组的 ...

  7. java指定编码的按行读写txt文件(几种读写方式的比较)

    转: java指定编码的按行读写txt文件(几种读写方式的比较) 2018年10月16日 20:40:02 Handoking 阅读数:976  版权声明:本文为博主原创文章,未经博主允许不得转载. ...

  8. C#读写txt文件的两种方法介绍[转]

    C#读写txt文件的两种方法介绍 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出 ...

  9. C#读写txt文件的两种方法介绍 v

    C#读写txt文件的两种方法介绍 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出 ...

随机推荐

  1. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  2. 字符串格式化format方法

    通过位置参数传参 print('{}, {}'.format('KeithTt', 18)) # KeithTt, 18 位置参数可以通过索引调用 print('{1}, {0}'.format('K ...

  3. 在kubernetes集群上用helm安装Datadog(Monitoring)

    Datadog is a monitoring service that gathers monitoring data from your containers within your Azure ...

  4. Android DownloadManager 的使用

    分类: android 技巧2013-05-28 10:32 3278人阅读 评论(1) 收藏 举报   目录(?)[+]   从Android 2.3(API level 9)开始Android用系 ...

  5. BSGS&EXBSGS 大手拉小手,大步小步走

    大步小步走算法处理这样的问题: A^x = B (mod C) 求满足条件的最小的x(可能无解) 其中,A/B/C都可以是很大的数(long long以内) 先分类考虑一下: 当(A,C)==1 即A ...

  6. 【CF711D】Directed Roads

    题目大意:给定一个 N 个点,N 条边的无向图,现给每条边定向,求有多少种定向方式使得定向后的有向图中无环. 题解:显然,这是一个外向树森林,定向后存在环的情况只能发生在基环树中环的位置,环分成顺时针 ...

  7. advancedsearch.php织梦高级自定义模型字段无法调用解决方案

    advancedsearch.php织梦dedecms 高级自定义模型字段无法调用解决方案 ,具体步骤如下: 1  打开修改puls/advancedsearch.php文件,找到复制代码(不同版本可 ...

  8. shopnc 手机网站配置

    完整版SHOPNC下载地址:http://www.fenxiangweb.com/thread-7643-1-1.html SHOPNC手机wap版安装教程 1.进入根目录下mobile/readme ...

  9. springboot整合freemarker

    前后端分离现在越来越多,如何有效的使用springboot来整合我们的页面是一个很重要的问题. springboot整合freemarker有以下几个步骤,也总结下我所犯的错误: 1.加依赖: 2.配 ...

  10. 使用博客系统发生_STORAGE_WRITE_ERROR_错误

    因为本人有自己的vps正好又最近学习了网络的搭建,但是呢不是一番风顺的在假设好PHP.http和MySQL后吧一个博客系统放进去后出现了以下问题 好吧== 出来了这个问题到是让我看了半天,然后查了查说 ...