C++文件输入输出流
写在前面的话:C++中对文件的操作跟C语言是有很大差别的,因此总结一下C++对文件的操作。
1、通常用法
在C++中队文件的输入输出流和对内存的输入输出流以及对字符串的输入输出流接口是一致的,如果输入流能产生字节,可以用一个提取操作符从这个流中获取信息。这个提取符产生并格式化目的对象所期望的信息类型。虽然输入流用起来很方便,但是也有一个问题,在使用格式化的输入机制,尤其是标准输入时,会遇到和C语言中scanf()中同样的问题。如果输入一个非期望值,进程则被偏离,而且它很难恢复。另外,格式化的输入缺省以空格为分隔符。那么如下面的代码:
#include <iostream> using namespace std; int main(void) { int i; cin >> i; float f; cin >> f; char c; cin >> c; char buf[100]; cin >> buf; cout << "i = " << i << endl; cout << "f = " << f << endl; cout << "c = " << c << endl; cout << "buf = " << buf << endl; cout << flush; cout << hex << "0x" << i << endl; return 0; }
给出以下输入:
12 1.4 c this is a test
我们应该得到与输入相同的输出。
12
1.4
c
this is a test
但是实际输出为:
12
1.4
c
this
注意到buf只得到第一个字,这个由于输入机制是通过寻找空格来分隔输入的,而空格在“this”的后面。另外如果连续的输入串长于为buf分配的存储空间,也会发生buf溢出现象。
2、面向行的输入
要获取一行输入,有两种选择:成员函数get()、getline()。两个函数都是有三个参数:指向存储结果缓冲区的指针、缓冲区大小(不能超过其限度)和知道什么时候停止输入的终止符。终止符有一个经常用到的缺省值‘\n’。两个函数遇到输入终止符时,都把零存储在结果缓冲区里。
它们的区别如下:
1. get()遇到输入流的分隔符就停止,而不从输入流中提取分隔符。如果用相同的分隔符再调用一次get()函数,它会立即返回而不带任何输入。
2. getline()与其相反,它从输入流中提取分隔符,但仍没有把存储在结果缓冲区里。
总之,当我们在处理文本文件时,无论什么时候需要读出一行,都会想到getline()函数。
3、读取原始字节
如果要读取原始字节,即二进制代码的话,可以使用read()函数,第一个参数指向内存目的地址的指针,第二个参数指明要读取的字节数。
4、写入原始字节
如果要写入原始字节,使用write()函数。
遇到的问题:输入流什么时候返回假值?
如下面的程序:
#include <iostream> #include <fstream> #include <assert.h> using namespace std; const int SZ = 100; int main() { char buf[SZ]; { ifstream in("strfile.cpp"); assert(in); ofstream out("strfile.out"); assert(out); int i = 1; while(in.get(buf, SZ)) { in.get(); // throw away next character cout << buf << endl; out << i++ << ": " << buf << endl; } } ifstream in("strfile.out"); assert(in); while(in.getline(buf, SZ)) { char *cp = buf; while(*cp != ':') { cp++; } cp += 2; cout << cp << endl; // must still add \n } }
其中的文件输入流不是应该在文件结尾处才返回假值么?但是实际运行是,如果遇到空行程序就从while循环中跳出了,这个为什么呢?
相关文章
- C++ 使用 TinyXml 解析 XML 文件
- C++ 查找 Temp 目录下指定类型文件的 HEX 特征
- 安全之路 —— C/C++实现利用添加注册表项实现文件自启动
- C++扫雷小游戏(基于CMD命令行)
- C/C++进程文件锁 之 fcntl函数的用法总结(非阻塞O_NONBLOCK)
- C++程序设计同步实践宝典——前言
- C++程序设计:原理与实践(进阶篇)16.7 拷贝
- dll文件的c++制作
- C#调用C++的dll文件方法
- C/C++注册表【2】打开,创建,删除
- c++中.dll与.lib文件的生成与使用的详解
- C++ 基础知识
- 一个完整的C++程序SpreadSheet - 1) 类的声明和定义
- 《C++ 黑客编程揭秘与防范(第2版)》—第6章6.1节PE文件结构
- 《C++ 黑客编程揭秘与防范(第2版)》——6.1 PE文件结构
- 《C++面向对象高效编程(第2版)》——3.8 C++中类和结构的区别
- 基于 C++实现(控制台)学生成绩管理系统【100010589】
- 基于C++实现 MD5 算法的文件完整性校验程序【100010122】
- Ubuntu16.04下Tensorflow C++编译并调用pb文件(一)
- C++ benchmark,rapidcheck 检查瓶颈(QuickCheck 克隆) good
- C++根据扩展名获取文件图标、类型
- 【华为OD机试真题 java、python、c++】统计友好度最大值(100%通过+复盘思路)
- 101、【树与二叉树】leetcode ——617. 合并二叉树:递归法+迭代法(C++版本)
- 82、【栈与队列】leetcode ——225. 用队列实现栈(C++版本)
- 【C++】基于linux文件管理和C++的I/O框架,实现命令行下的文件管理器
- 引用内部函数绑定机制,R转义字符,C++引用,别名,模板元,宏,断言,C++多线程,C++智能指针
- lua入门之二:c/c++ 调用lua及多个函数返回值的获取