最近在做一个从groundtruth_rect.txt中读取按行存储的矩形元素(x, y, w, h),文本存储的格式如下:

310,102,39,50
308,100,39,50
306,99,39,50
306,98,38,49
304,97,38,49
303,96,37,48
一般处理这种带格式的存储数据,我最喜欢的就是C语言中的格式化的输出和输入fprintf和fscanf,因为知道格式,所以一个循环反复就可以将矩形从txt中提取出来,非常的简单方便。可是当我定义了一个FILE* file = fopen("groundtruth_rect.txt","r");时程序总是有一个bugger,编译器(VS2010)输出的错误信息是:
error C2679: 二进制“=”: 没有找到接受“FILE *”类型的右操作数的运算符(或没有可接受的转换)
1>          C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\winbase.h(6618): 可能是“_WIN32_FIND_DATAA &_WIN32_FIND_DATAA::operator =(const _WIN32_FIND_DATAA &)”

调来调去也没有找到错误原因,在网上也没有找到相关的提示。我猜测原因可能是由于在程序中定义了和包含了一下东西以方便我能够进行文件夹下的序列图像的路径获取:

#define _AFXDLL
#define _WIN32_WINNT 0x0502 
#include <WinBase.h>
#include <ShlObj.h>
#include <afxdlgs.h>
#include <atlstr.h>
(如果有“同道中人”希望能指点一二)
如果去掉上面的那一部分所有的bugger就消失了。因为必须用到上面获取路径的办法,所以只好放弃使用FILE *这种C语言的文件操作,转而使用C++提供的文件操作方法:
string line;
getline(file, line);
istringstream linestream(line);
string x1, y1, w1, h1;
getline(linestream, x1, ',');
getline(linestream, y1, ',');
getline(linestream, w1, ',');
getline(linestream, h1, ',');
int x = atoi(x1.c_str());
int y = atoi(y1.c_str());
int w = atoi(w1.c_str());
int h = atoi(h1.c_str());
groundtruth_rect[i] = Rect(x, y, w, h);
上面这段代码是一种比较好的方法,在运行中没有出现错误。采用的完全是按照字符来对待,以 ‘,’ 作为行的getline的结尾,一行一行的读取数据,然后再利用atoi()将字符串转变为数字,也就实现了格式化读取数据的目的。
下面先给出使用getline的范例
<span style="font-size:18px;">// string_getline_sample.cpp
// compile with: /EHsc
// Illustrates how to use the getline function to read a
// line of text from the keyboard.
//
// Functions:
//
//    getline       Returns a string from the input stream.
//#pragma warning(disable:4786)
#include <string>
#include <iostream>using namespace std ;int main()
{string s1;cout << "Enter a sentence (use <space> as the delimiter): ";getline(cin,s1, ' ');cout << "You entered: " << s1 << endl;;
}</span>

然后再给出atoi()的使用范例:atoi会把能够解释为数字的字符串转变为整形数据,从字符串的开头一直到第一个不能被解释为数字的字符为止,比如“\0”等。

<span style="font-size:18px;">// crt_atoi.c
// This program shows how numbers
// stored as strings can be converted to
// numeric values using the atoi functions.#include <stdlib.h>
#include <stdio.h>
#include <errno.h>int main( void )
{char    *str = NULL;int     value = 0;// An example of the atoi function.str = "  -2309 ";value = atoi( str );printf( "Function: atoi( \"%s\" ) = %d\n", str, value );// Another example of the atoi function.str = "31412764";value = atoi( str );printf( "Function: atoi( \"%s\" ) = %d\n", str, value );// Another example of the atoi function // with an overflow condition occuring.str = "3336402735171707160320";value = atoi( str );printf( "Function: atoi( \"%s\" ) = %d\n", str, value );if (errno == ERANGE){printf("Overflow condition occurred.\n");}
}</span>

输出为:

Function: atoi( "  -2309 " ) = -2309
Function: atoi( "31412764" ) = 31412764
Function: atoi( "3336402735171707160320" ) = 2147483647
Overflow condition occurred.

但一开始并没有想到这种方法,而是采用了一个比较笨的办法,刚开始还能正确读取数据,可是读到一半的时候居然读出的数据全是0了,我也真是快疯了(本来痛痛快快的使用C中的格式化输入就好了,结果搞了两个小时才搞定,心情郁闷可想而知)
//int  test[4];

//test[0] = 0;
//file>>dec>>test[0];
//groundtruth_rect[i].x = test[0];

//test[1] = 0;
//file.seekg(1,ios::cur);
//file>>dec>>test[1];
//groundtruth_rect[i].y = test[1];

//test[2] = 0;
//file.seekg(1,ios::cur);
//file>>dec>>test[2];
//groundtruth_rect[i].width = test[2];

//test[3] = 0;
//file.seekg(1,ios::cur);
//file>>dec>>test[3];
//groundtruth_rect[i].height = test[3];

//file.seekg(1,ios::cur);
采用的方法是运算符>>,中间的dec是表示采用十进制的方式输入,插入器(>>)+操纵符(dec)的方式,刚开始并没有加file.seekg(1,ios::cur);进行文件的重定位,除了第一个之外后面读到的数据全是0,我就这样一步一步的通过调试(不太熟悉这个机制,又急着实现,只能盲人摸象了)。后来采用了file.seekg(1,ios::cur);来对文件的读位置进行定位,跳过了格式化作用的逗号,就这样才能正确的读入了。结果开始运行后,发现一共500多个矩形框的数据,这种方式只能读取到221个,而且读出的数据是对的,但是后面的200多个就不知道为啥读不进来了。这个bugger也依然没有解决(希望有高人指点迷津)!
有了以上的调试经历,我感觉到不能再盲人摸象,便决定对C++的典型文件操作进行一下学习和总结:
具体内容可以参看了别人的博文,我下面只对比较常用的内容进行介绍:http://blog.csdn.net/jiangxinyu/article/details/7875931 和 http://www.cnblogs.com/kzloser/archive/2012/07/16/2593133.html

不管是Linux(shell)还是windows下,一般默认打开的输入输出设备对象都会有三种:一是标准输入设备键盘缓冲区,二是标准输出设备显示器缓冲区,三是错误信息。(特别是在linux下的shell命令,很经典的对照,有兴趣的可以了解一下,输入输出重定向的方法是不是类似c++中的iostream与fstream,ofstream,ifstream)。
当然首先就是打开文件,一般都会有文本文件和二进制文件的选项,默认大都是文本文件,C语言中的“wb+” b表示为二进制,而C++中为ios::binary
C++有
操纵符 功能 输入/输出
dec 格式化为十进制数值数据 输入和输出
endl 输出一个换行符并刷新此流 输出
ends 输出一个空字符 输出
hex 格式化为十六进制数值数据 输入和输出
oct 格式化为八进制数值数据 输入和输出
setpxecision(int p) 设置浮点数的精度位数 输出
对应到C中有格式化的输入输出:%c,%d,%f,%s等等。
另外与C的文件操作方式不太一样的地方是C++管理读指针和写指针,分别可以利用seekg和seekp来设定
ios::beg:  文件开头
ios::cur:  文件当前位置
ios::end:  文件结尾
而对应到C则是fseek(),ftell等。
C的文件操作总结如下:
C++经典的文件操作如下:
*******************************************************************************************************************************************************************************************************2015-7-24

转载于:https://www.cnblogs.com/huty/p/8519296.html

C/C++文件操作经验总结相关推荐

  1. MiniGUI开发指南

    MiniGUI 目录 MiniGUI 体系结构 概览 引言 POSIX线程 基于PThread的微客户/服务器结构 多线程通讯的关键数据结构--消息队列 面向对象技术在MiniGUI中的应用 未来考虑 ...

  2. python怎么建文件dome_Python专题(四) 如何制作一个demo给老板看

    ​用了几个月做了一个项目,肯定要好好给老板展示一下.你会怎么做呢?是不是立马开始截图准备做PPT了呢?PPT虽好,但是也只能给老板展示一些静态图片和视频,并不能实时展示你的功能.那么我们可以用Pyth ...

  3. 鸟哥的Linux私房菜(基础篇)- Red Hat 6.x旧文件

    Red Hat 6.x旧文件 最近更新日期:2001/11/04 这里的文章是在 1999~2001 年之间写成的,基本上都是鸟哥不成熟的一些操作经验而已,有问题的地方可能不少啊!有兴趣者,请前往Li ...

  4. /etc/sysconfig/iptables.save文件的用途

    [根据个人实际操作经验总结,未做求证,仅做个人分享] service iptables save 保存规则时   会生成/etc/sysconfig/iptables.save文件 该文件保存内容为修 ...

  5. linux zip压缩排除目录,Linux系统zip压缩命令详细参数,附文件排除选项的正确用法...

    这次给博客添加了纯代码缓存之后,发现缓存文件竟然达到了50多MB!而我的服务器每次还需要同步至七牛,文件体积的增加都会增加文件远程同步备份的时间.因此,我第一想到的办法就是在网站ZIP压缩打包的时候排 ...

  6. ubuntu20.04 系统下 .7z 文件解压缩到指定的目录下

    问题描述 环境: ubuntu 20.04 ubuntu 下有个 7z 的压缩文件需要解压,需要解压到指定的目录下,而不是压缩包当前目录下 安装 p7zip-full ubuntu 下的 7z 解压软 ...

  7. linux删除指定大小的文件,Linux下删除空文件,删除指定大小的文件

    Linux下批量删除空文件(大小等于0的文件)的方法: find . -name "*" -type f -size 0c | xargs -n 1 rm -f 用这个还可以删除指 ...

  8. cmf后台获取服务器文件,thinkcmf高级应用,如何自定义模板位置?

    本博客不欢迎:各种镜像采集行为,请尊重知识产权法律法规.大家都是程序员,不要闹得不开心. thinkcmf默认情况下,自带了两个模板,一个是用于前台的模板simpleboot3,另外一个是用于后台的模 ...

  9. amr文件怎么转换成mp3,5种方法供你选择

    amr文件怎么转换成mp3?如果你常常使用手机录音或下载手机铃声,那么AMR格式对你来说一定不会陌生.因为amr文件的资源占用率低.传输方便,通常用作各大手机厂商广泛使用的一种保存录音文件的格式,非常 ...

  10. android的sqlite导出及数据操作经验分享

    转载请注明 出处( http://blog.csdn.net/alankobe/archive/2011/03/20/6262175.aspx) 分享下android的sqlite导出及数据操作经验. ...

最新文章

  1. python整数类型在每一台计算机上的取值范围是一样的_Python编程知识点总结
  2. 精通python能干嘛-一个程序员怎样才算精通Python?
  3. C#动态属性(.NET Framework4.5支持)
  4. html 标题树,html树
  5. 《中国人工智能学会通讯》——1.27 智能助手的核心价值
  6. 什么原因导致MacBook Pro过热?如何解决这一问题?
  7. 运维成长日记:我是如何走上IT运维这条不归路的
  8. Atitit 代码的导航 1.1.代码的层次导航 语句 函数方法 类 包 1.2.4.4. 代码可视化 流程图 一个方法内,多个代码行的关系图 语句to方法 2 1.3.4.5. 类图 类结构
  9. Selenium+IP爬虫刷新网页
  10. 刨根究底字符编码之二——关键术语解释(下)
  11. PoE供电技术与应用
  12. C语言应用(3)——Base64编码/解码
  13. 科技云报道:新基建已到来,网络安全建设跟上了吗?
  14. 空气净化器UL867测试报告流程
  15. 惠州市有哪些学计算机的学校,惠州有哪些好学校?
  16. 短视频App开发方案IOS架构
  17. 用最小二乘法来拟合数据
  18. html添加靠左的图片,div 居左靠左布局 CSS居左靠左布局
  19. GD32串口通信注意事项
  20. 吕本富:从平台经济到平台经济学

热门文章

  1. 去政府办事,最好事先联系,避免换了地方
  2. 解决办法:RuntimeError: dictionary changed size during iteration
  3. 藩国进贡,朝庭厚赐,吃亏了吗?
  4. 创业失败反思:市场跟销售完全是两回事
  5. 用DIB位图显示图像
  6. oracle 导入文件 年月日,oracle导入文件时,日期格式问题
  7. 全国一级计算机基础及ps题目,一级计算机基础及Photoshop应用模拟试题(14)
  8. xp电脑多少位怎么看_怎么看电脑是32位还是64位
  9. python3读取多行数据合并_python3 数据规整化:清理、转换、合并、重塑(一)
  10. 机器学习大作业_机器学习编程作业6-支持向量机(Python版)