一、打开文件  

在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是:
void open(const char* filename,int mode,int access);
参数:
filename:要打开的文件名
mode:要打开文件的方式
access:打开文件的属性  //基本很少用到

打开文件的方式在类iOS(是所有流式I/O类的基类)中定义,常用的值如下:

ios::in 为输入(读)而打开文件
ios::out 为输出(写)而打开文件
ios::ate 初始位置:文件尾
ios::app 所有输出附加在文件末尾
ios::trunc 如果文件已存在则先删除该文件
ios::binary 二进制方式

可以用“或”把以上属性连接起来,如ios::out|ios::binary

打开文件的属性同样在ios类中也有定义:

0 普通文件,打开操作
1 只读文件
2 隐含文件
4 系统文件

对于文件的属性也可以使用“或”运算和“+”进行组合使用。

二、关闭文件  

打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此操作,如:file1.close();就把file1相连的文件关闭。

三、读写文件  

读写的文件分为文本文件和二进制文件,对于文本文件的读取比较简单,用插入器和析取即可,而对于二进制的读取就要复杂些。

3.1文本文件的读写

[cpp] view plain copy print?
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. int main()
  5. {
  6. ofstream out("F://IM_VIDEO//out.txt");
  7. //  ifstream in("F://IM_VIDEO//in.txt");
  8. if (out.is_open())
  9. {
  10. out << "This is a line.\n";
  11. out << "This is another line.\n";
  12. out.close();
  13. }
  14. return 0;
  15. }
#include <iostream>
#include <fstream>
using namespace std;int main()
{ofstream out("F://IM_VIDEO//out.txt");
//  ifstream in("F://IM_VIDEO//in.txt");if (out.is_open()){out << "This is a line.\n";out << "This is another line.\n";out.close();}return 0;
}

运行后发现,在相应目录下生成了txt文件out.txt,里面添加了两句话:this is a line. This is another line.

[cpp] view plain copy print?
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. //读取out.txt文件,并把其内容显示到屏幕中
  5. int main()
  6. {
  7. char buffer[256];
  8. ifstream in("F://IM_VIDEO//out.txt");
  9. if (!in.is_open())
  10. {
  11. cout << "Error opening file"; exit(1);
  12. }
  13. while (!in.eof())
  14. {
  15. in.getline(buffer, 100);
  16. cout << buffer << endl;
  17. }
  18. return 0;
  19. }
#include <iostream>
#include <fstream>
using namespace std;
//读取out.txt文件,并把其内容显示到屏幕中
int main()
{char buffer[256];ifstream in("F://IM_VIDEO//out.txt");if (!in.is_open()){cout << "Error opening file"; exit(1);}while (!in.eof()){in.getline(buffer, 100);cout << buffer << endl;}return 0;
}

除了例子中的eof,它是ifstream 从类 ios 中继承过来的成员函数。另外还有状态标志符的验证(Verification of state flags)

bad()
如果在读写过程中出错,返回 true 。例如:当我们要对一个不是打开为写状态的文件进行写入时,或者我们要写入的设备没有剩余空间的时候。
fail()
除了与bad() 同样的情况下会返回 true 以外,加上格式错误时也返回true ,例如当想要读入一个整数,而获得了一个字母的时候。
eof()
如果读文件到达文件末尾,返回true。
good()
这是最通用的:如果调用以上任何一个函数返回true 的话,此函数返回 false 。

获得和设置流指针(get and put stream pointers):
所有输入/输出流对象(i/o streams objects)都有至少一个流指针:
ifstream, 类似istream, 有一个被称为get pointer的指针,指向下一个将被读取的元素。
ofstream, 类似 ostream, 有一个指针 put pointer ,指向写入下一个元素的位置。
fstream, 类似 iostream, 同时继承了get 和 put
可以通过使用成员函数:tellg() 和 tellp()来读出或配置这些指向流中读写位置的流指针
tellg() 和 tellp()

这两个成员函数不用传入参数,返回pos_type 类型的值(根据ANSI-C++ 标准) ,就是一个整数,代表当前get 流指针的位置 (用tellg) 或 put 流指针的位置(用tellp).
seekg() 和seekp()
这对函数分别用来改变流指针get 和put的位置。两个函数都被重载为两种不同的原型:
seekg ( pos_type position );
seekp ( pos_type position );
使用这个原型,流指针被改变为指向从文件开始计算的一个绝对位置。要求传入的参数类型与函数 tellg 和tellp 的返回值类型相同。
seekg ( off_type offset, seekdir direction );
seekp ( off_type offset, seekdir direction );

[cpp] view plain copy print?
  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. const char * filename = "F://IM_VIDEO//out.txt";
  5. //获取文件字节数
  6. int main() {
  7. long l, m;
  8. ifstream in(filename, ios::in | ios::binary);
  9. l = in.tellg();
  10. in.seekg(0, ios::end);
  11. m = in.tellg();
  12. in.close();
  13. cout << "size of  " << filename << " is " << (m - 1) << " bytes.\n" << endl;
  14. return 0;
  15. }
#include <iostream>
#include <fstream>
using namespace std;const char * filename = "F://IM_VIDEO//out.txt";
//获取文件字节数
int main() {long l, m;ifstream in(filename, ios::in | ios::binary);l = in.tellg();in.seekg(0, ios::end);m = in.tellg();in.close();cout << "size of  " << filename << " is " << (m - 1) << " bytes.\n" << endl;return 0;
}

3.2二进制文件的读写

(1)put()
  put()函数向流写入一个字符,其原型是ofstream &put(char ch),使用也比较简单,如file1.put('c');就是向流写一个字符'c'。
(2)get()
  get()函数比较灵活,有3种常用的重载形式:
  1.和put()对应的形式:ifstream &get(char &ch);功能是从流中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符。如file2.get(x);表示从文件中读取一个字符,并把读取的字符保存在x中。
  2.重载形式。原型是:int get();从流中返回一个字符,如果到达文件尾,返回EOF,如x=file2.get();和上例功能是一样的。
  3.ifstream &get(char *buf,int num,char delim='n');这种形式把字符读入由 buf 指向的数组,直到读入了 num 个字符或遇到了由 delim 指定的字符,如果没使用 delim 这个参数,将使用缺省值换行符'n'。例如:
  file2.get(str1,127,'A');//从文件中读取字符到字符串str1,当遇到字符'A'或读取了127个字符时终止。
(3)读写数据块
  在二进制文件中,使用<< 和>>,以及函数(如getline)来操作符输入和输出数据。要读写二进制数据块,使用成员函数read()和write()成员函数,它们原型如下:
  read(unsigned char *buf,int num);
  write(const unsigned char *buf,int num);
  这里 buffer 是一块内存的地址,用来存储或读出数据。参数num是一个整数值,表示要从缓存(buffer)中读出或写入的字符数。read()从文件中读取 num 个字符到 buf 指向的缓存中,如果在还未读入 num 个字符时就到了文件尾,可以用成员函数 int gcount();来取得实际读取的字符数;而 write() 从buf 指向的缓存写 num 个字符到文件中,值得注意的是缓存的类型是 unsigned char *,有时可能需要类型转换。

opencv读写txt文件:

现使用opencv对图像Mat类型读写txt文件进行汇总~

首先将一幅图像写入txt文件中(实例1):

[cpp] view plain copy print?
  1. //#include <iterator>
  2. //#include <vector>
  3. #include<opencv2\opencv.hpp>
  4. #include<core/core.hpp>
  5. #include<highgui/highgui.hpp>
  6. #include<cv.h>
  7. #include <iostream>
  8. #include <fstream>
  9. using namespace std;
  10. using namespace cv;
  11. /*
  12. * 功能 : 将 Mat 数据写入到 .txt 文件
  13. * 函数 : WriteData
  14. * 访问 : public
  15. * 返回 : -1:打开文件失败;0:写入数据成功;1:矩阵为空
  16. */
  17. int WriteData(string fileName, Mat& matData)
  18. {
  19. int retVal = 0;
  20. if (matData.empty())
  21. {
  22. cout << "矩阵为空" << endl;
  23. retVal = 1;
  24. return (retVal);
  25. }
  26. // 打开文件
  27. ofstream outFile(fileName.c_str(), ios_base::out);  //按新建或覆盖方式写入
  28. if (!outFile.is_open())
  29. {
  30. cout << "打开文件失败" << endl;
  31. retVal = -1;
  32. return (retVal);
  33. }
  34. // 写入数据
  35. for (int i = 0; i < matData.rows; i++)
  36. {
  37. uchar* pixelPtr = matData.ptr<uchar>(i);            //获取矩阵每行首地址指针
  38. for (int j = 0; j < matData.cols*matData.channels(); j++)
  39. {
  40. int data = pixelPtr[j];
  41. outFile << data<<"\t";
  42. }
  43. outFile << endl;
  44. }
  45. return (retVal);
  46. }
  47. int main(int argc, char* argv[])
  48. {
  49. Mat scr = imread("F://IM_VIDEO//kobe.jpg");
  50. WriteData("F://IM_VIDEO//kobe.txt", scr);
  51. }
//#include <iterator>
//#include <vector>
#include<opencv2\opencv.hpp>
#include<core/core.hpp>
#include<highgui/highgui.hpp>
#include<cv.h>
#include <iostream>
#include <fstream>using namespace std;
using namespace cv;
/*
* 功能 : 将 Mat 数据写入到 .txt 文件
* 函数 : WriteData
* 访问 : public
* 返回 : -1:打开文件失败;0:写入数据成功;1:矩阵为空
*/
int WriteData(string fileName, Mat& matData)
{int retVal = 0;if (matData.empty()){cout << "矩阵为空" << endl;retVal = 1;return (retVal);}// 打开文件ofstream outFile(fileName.c_str(), ios_base::out);   //按新建或覆盖方式写入if (!outFile.is_open()){cout << "打开文件失败" << endl;retVal = -1;return (retVal);}// 写入数据for (int i = 0; i < matData.rows; i++){uchar* pixelPtr = matData.ptr<uchar>(i);            //获取矩阵每行首地址指针  for (int j = 0; j < matData.cols*matData.channels(); j++){int data = pixelPtr[j];outFile << data<<"\t";}outFile << endl;}return (retVal);
}int main(int argc, char* argv[])
{Mat scr = imread("F://IM_VIDEO//kobe.jpg");WriteData("F://IM_VIDEO//kobe.txt", scr);
}

上面程序可以将图像像素写入到自己命名的txt文件中。

将txt中的数据写入Mat类型文件中,并保存为图片格式(实例2):

[cpp] view plain copy print?
  1. #include<opencv2\opencv.hpp>
  2. #include<core/core.hpp>
  3. #include<highgui/highgui.hpp>
  4. #include<cv.h>
  5. #include <iostream>
  6. #include <fstream>
  7. #include <string>
  8. using namespace std;
  9. using namespace cv;
  10. void getFromText(String nameStr, Mat &myMat, uchar *pCurrentFace)
  11. {
  12. String nameFaceStr;
  13. //nameFaceStr = nameStr + "kobe.txt";//the face file path
  14. ifstream myFaceFile;
  15. myFaceFile.open(nameFaceStr, ios::in);
  16. int temp;
  17. for (int r = 0; r < myMat.cols*myMat.rows*myMat.channels(); r++)
  18. {
  19. myFaceFile >> temp;
  20. pCurrentFace[r] = (uchar)temp;
  21. }
  22. for (int i = 0; i < myMat.rows; i++)
  23. {
  24. uchar *pixelPtr = myMat.ptr<uchar>(i);
  25. for (int j = 0; j < myMat.cols*myMat.channels(); j++)
  26. {
  27. pixelPtr[j] = pCurrentFace[i*j+j];
  28. }
  29. }
  30. myFaceFile.close();
  31. }
  32. int main(int argc, char* argv[])
  33. {
  34. Mat scr = imread("F://IM_VIDEO//kobe.jpg");
  35. imshow("kobe", scr);
  36. Mat TrainData = Mat::zeros(scr.rows, scr.cols, CV_32FC3);
  37. imshow("juzhen", TrainData);
  38. uchar *pCurrentFace = (uchar*)malloc(scr.rows * scr.cols * 3 * sizeof(uchar));
  39. getFromText("F://IM_VIDEO//kobe.txt", TrainData, pCurrentFace);
  40. imshow("xianshi", TrainData);
  41. waitKey(0);
  42. }
#include<opencv2\opencv.hpp>
#include<core/core.hpp>
#include<highgui/highgui.hpp>
#include<cv.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
using namespace cv;void getFromText(String nameStr, Mat &myMat, uchar *pCurrentFace)
{String nameFaceStr;//nameFaceStr = nameStr + "kobe.txt";//the face file pathifstream myFaceFile;myFaceFile.open(nameFaceStr, ios::in);int temp;for (int r = 0; r < myMat.cols*myMat.rows*myMat.channels(); r++){myFaceFile >> temp;pCurrentFace[r] = (uchar)temp;}for (int i = 0; i < myMat.rows; i++){uchar *pixelPtr = myMat.ptr<uchar>(i);for (int j = 0; j < myMat.cols*myMat.channels(); j++){pixelPtr[j] = pCurrentFace[i*j+j];}}myFaceFile.close();
}int main(int argc, char* argv[])
{Mat scr = imread("F://IM_VIDEO//kobe.jpg");imshow("kobe", scr);Mat TrainData = Mat::zeros(scr.rows, scr.cols, CV_32FC3);imshow("juzhen", TrainData);uchar *pCurrentFace = (uchar*)malloc(scr.rows * scr.cols * 3 * sizeof(uchar));getFromText("F://IM_VIDEO//kobe.txt", TrainData, pCurrentFace);imshow("xianshi", TrainData);waitKey(0);
}

but,,,这个有问题,暂时没找到正确的办法,请赐教、、、

参考:

http://blog.csdn.net/ljh0600301217/article/details/8731190

http://blog.csdn.net/bendanban/article/details/30306505?utm_source=tuicool&utm_medium=referral (MATLAB,c++)

C++读写txt文件方式以及基于opencv的Mat数据类型读写txt文件相关推荐

  1. linux下eeprom读写测试,本科毕业设计__基于linux的eeprom的读写控制.doc

    毕业设计[论文] 题目:基于linux的EEPROM的读写控制 毕业论文(设计)原创性声明 本人所呈交的毕业论文(设计)是我在导师的指导下进行的研究工作及取得的研究成果.据我所知,除文中已经注明引用的 ...

  2. Spring MVC-09循序渐进之文件上传(基于Servlet3.0+Html5客户端上传文件)

    示例 测试 源码 虽然Servlet3.0+中上传文件,我们在服务端编程即可非常容易,但是用户体验却不是非常友好.单独的一个HTML表单并不能显示进度条,或者显示已经成功上传的文件数量. 不管是Jav ...

  3. python如何创建txt文档_基于python实现生成指定大小txt文档

    前言 在测试过程中经常遇到文件上传的功能,文件的大小边界值测试一直没有好的解决办法,这里我分享一个创建文件的脚本希望对大家有帮助. demo """ * Create b ...

  4. OpenCV入门: Mat数据类型及其转换,访问

    1. 总结 先贴上我总结的Opencv的数据类型, 主要是针对不同Mat类型进行新建,修改和访问时使用, 更详细的数据访问见下文: 2. CV_8UC3解说 新建一个CV_8UC3型的cv::Mat, ...

  5. OpenCV:Mat数据类型/16to8bit/RECT/画线填充

    Mat类型与数据类型对应关系: Unsigned 8bits uchar 0~255 Mat: CV_8UC1, CV_8UC2, CV_8UC3, CV_8UC4 Signed 8bits char ...

  6. 如何取回服务器上的文件网页设计,毕业设计(论文)-基于内容中心网络开发平台的文件分享精选.docx...

    毕业设计(论文)-基于内容中心网络开发平台的文件分享精选 基于内容中心网络开发平台的文件分享摘要当前的网络环境与网络诞生之初时相比已经发生变化,信息更多被用于分享和合作,而非仅仅从一地传送至另一地,基 ...

  7. opencv的mat赋值_OpenCV Mat 类型定义和赋值

    1.一般的Mat定义方法:cv::Mat M(height,width,),例: cv::Mat M(480,640,CV_8UC3); 表示定义了一个480行640列的矩阵,矩阵的每个单元的由三个( ...

  8. python读取文件报错必须有一个正确的读写方式_python文件操作

    第一步 排除文件打开方式错误: r只读,r+读写,不创建 w新建只写,w+新建读写,二者都会将文件内容清零 (以w方式打开,不能读出.w+可读写) w+与r+区别: r+:可读可写,若文件不存在,报错 ...

  9. python所有文件都能用文本方式打开_python 打开文件方式讲解、常用读写操作指令(全)以及读写常见问题...

    python读写方式 python的读写,在实际应用中还是很广泛的,有必要系统性的学习一下,以便于处理问题时的抉择和对现象的合理解释.例如,python用logging写入日志文件默认的读写方式是&q ...

最新文章

  1. [0618]Tyvj1128中文大写数字
  2. 家庭记账软件 —— Java
  3. oracle 运营维护_oracle运维(持续更新)
  4. Android Log
  5. 面试官:你说对MySQL事务很熟?那我问你10个问题
  6. Python 3 的新特性zz
  7. [10.2模拟] book
  8. deliphi 字符串分割_delphi中拆分字符串的函数
  9. django 使用原生SQL语句反向生成MODELS.PY中的表结构
  10. 国庆假期程序员是这样给自己粉饰无限的逼格!
  11. Careercup - Facebook面试题 - 5890898499993600
  12. linux终端下载vscode,Ubuntu:安装vscode
  13. PHP验证码代码_php验证码类
  14. 方差分析与正交试验设计(四)
  15. PPT文件太大,怎样将PPT进行压缩?这一招教你实现
  16. ASP.NET WEB介绍
  17. win7系统如何提升电脑开机速度?
  18. Echarts柱状图在实体里面展示数据/柱状图顶部展示数据简记
  19. ora-12505错误
  20. 上海工程技术大学c语言试卷,上海工程技术大学2009_2010C语言试卷A.doc

热门文章

  1. linux系统中建立网络白名单,Linux下设置防火墙白名单(RHEL 6和CentOS 7)的步骤
  2. qt widget 窗口拉伸_QTDesigner的QVBoxLayout自动随窗口拉伸
  3. crytojs加密 java解密,使用CryptoJS在Javascript中加密并在Java中解密
  4. 数据结构 - 反转单链表(C++)
  5. 删除svn同步文件目录
  6. 阿里短信 ajax,阿里大于 短信 注册验证 ajax返回数据的问题
  7. c语言基础变量,C语言基础-第一篇-变量
  8. android setting模块,android O版本 设置(Settings)模块总结--设置的一级界面的加载
  9. 腾讯公布 23 年前第一间办公室照片
  10. 重磅!GitHub 全部源代码被泄露?