ofstream和ifstream详细用法
ASCII和二进制文件的输入输出
First:包含头文件#include <fstream>
ASCII输入:
首先要创建一个in-stream对象:ifstream fin("input.txt");
逐词读取:fin>>num>>s;
读取过程中遇到空白符,>>操作符就会停止读取内容,知道遇到另一个>>操作符。
逐行读取:fin.getline(sentence, num);
第一个参数用来接受char数组;第二个参数是在遇到换行符之前,数组允许接受的最大元素数量。
ASCII输出:
首先声明一个ofstream-fout类对象(打开文件):ofstream fout("output.txt");
操作举例:
int num = 150;
char name[] = "John Doe";
fout << "Here is a number: " << num << "/n";
fout << "Now here is a string: " << name << "/n";
关闭文件(自动保存文件),或者回写文件缓冲(保持文件打开的情况下保存文件):
fout << flush; fout.close();
二进制输入输出:
声明:不再使用插入(<<)和提取(>>)操作符,必须使用read()和方法write()读取和写入二进制文件。
First:以二进制方式打开文件——ofstream fout("file.dat", ios::binary);
写入:write()——共两个参数,第一个是指向对象的char类型的指针, 第二个是对象的大小(译者注:字节数)。
操作举例:
int number = 30; fout.write((char *)(&number), sizeof(number));
第一个参数写作"(char *)(&number)",这是把一个整型变量转为char *指针。第二个参数写作"sizeof(number)",sizeof() 返回对象大小的字节数。
优势:复杂结构体的写入——如果使用ASCII方式写入,只能一条一条的写入所有的成员变量。
操作举例:
struct OBJECT { int number; char letter; } obj;
obj.number = 15;
obj.letter = ‘M’;
fout.write((char *)(&obj), sizeof(obj));
读取:read()——同write()
ifstream fin("file.dat", ios::binary);
fin.read((char *)(&obj), sizeof(obj));
算法描述:
- #include <iostream>
- #include <fstream>
- #include <string>
- using namespace std;
- //输出空行
- void OutPutAnEmptyLine()
- {
- cout<<"\n";
- }
- //读取方式: 逐词读取, 词之间用空格区分
- //read data from the file, Word By Word
- //when used in this manner, we'll get space-delimited bits of text from the file
- //but all of the whitespace that separated words (including newlines) was lost.
- void ReadDataFromFileWBW()
- {
- ifstream fin("data.txt");
- string s;
- while( fin >> s )
- {
- cout << "Read from file: " << s << endl;
- }
- }
- //读取方式: 逐行读取, 将行读入字符数组, 行之间用回车换行区分
- //If we were interested in preserving whitespace,
- //we could read the file in Line-By-Line using the I/O getline_r() function.
- void ReadDataFromFileLBLIntoCharArray()
- {
- ifstream fin("data.txt");
- const int LINE_LENGTH = ;
- char str[LINE_LENGTH];
- while( fin. getline_r(str,LINE_LENGTH) )
- {
- cout << "Read from file: " << str << endl;
- }
- }
- //读取方式: 逐行读取, 将行读入字符串, 行之间用回车换行区分
- //If you want to avoid reading into character arrays,
- //you can use the C++ string getline_r() function to read lines into strings
- void ReadDataFromFileLBLIntoString()
- {
- ifstream fin("data.txt");
- string s;
- while( getline_r(fin,s) )
- {
- cout << "Read from file: " << s << endl;
- }
- }
- //带错误检测的读取方式
- //Simply evaluating an I/O object in a boolean context will return false
- //if any errors have occurred
- void ReadDataWithErrChecking()
- {
- string filename = "dataFUNNY.txt";
- ifstream fin( filename.c_str());
- if( !fin )
- {
- cout << "Error opening " << filename << " for input" << endl;
- exit(-);
- }
- }
- int main()
- {
- ReadDataFromFileWBW(); //逐词读入字符串
- OutPutAnEmptyLine(); //输出空行
- ReadDataFromFileLBLIntoCharArray(); //逐词读入字符数组
- OutPutAnEmptyLine(); //输出空行
- ReadDataFromFileLBLIntoString(); //逐词读入字符串
- OutPutAnEmptyLine(); //输出空行
- ReadDataWithErrChecking(); //带检测的读取
- return ;
- }
ASCII读取方式
ifstream 和ofstream对象
打开文件:
ifstream fin("input.txt"); ofstream fout("output.txt");
ifstream fin("file.dat", ios::binary); ofstream fout("file.dat", ios::binary);
默认打开为ASCII方式,不存在则创建,存在则覆盖。二进制方式打开文件选项ios::binary为额外标志。
其他额外选项:
ios::app 添加到文件尾
ios::ate 把文件标志放在末尾而非起始。
ios::trunc 默认. 截断并覆写文件。
ios::nocreate 文件不存在也不创建。
ios::noreplace 文件存在则失败。
检查文件:
good():返回一个布尔值,表示文件打开是否正确。
bad():返回一个布尔值,表示文件打开是否错误。
fail():类似于bad()。
文件状态:
eof() :返回是否标志已经到了文件末尾。
- #include <stdio.h>
- int main(void)
- {
- int n;
- int array[];
- while (scanf("%d",&n),n!=EOF) //while(scanf("%d",&n)!=EOF)也行
- {
- for (int i=; i<n; i++)
- scanf("%d",array+i);
- for (i=; i<n; i++)
- printf ("%d ",array[i]);
- }
- return ;
- }
eof()举例
读文件:
get():每次返回一个字符。
ignore(int,char):跳过输入流中n个字符,或在遇到指定的终止字符时提前结束(此时跳过包括终止字符在内的若干字符)。
原型:istream &ignore( streamsize num=1, int delim=EOF )
功能:用于输入流。它读入字符,直到已经读了num 个字符(默认为1)或是直到字符delim 被读入(默认为EOF)
调用方式:cin.ignore(n,终止字符)
- #include<iostream>
- usingnamespacestd;
- intmain()
- {
- chararray[];
- cin.ignore(,'a');
- cin.getline(array,);
- cout<<array<<endl;
- return0;
- }
ignore()举例
peek():
调用方式:cin.peek()
说明:其返回值是一个char型的字符,其返回值是指针指向的当前字符,但它只是观测,指针仍停留在当前位置,并不后移。如果要访问的字符是文件结束符,则函数值是EOF(-1)。
功能:从输入流中读取一个字符 但该字符并未从输入流中删除。即若把输入流比作一个 栈类,那么这里的peek函数就相当于栈的成员函数front ,而cin.get()则相当于栈的成员函数pop。
- / istream peek
- #include <iostream>
- using namespace std;
- int main () {
- char c;
- int n;
- char str[];
- cout << "Enter a number or a word: ";
- c=cin.peek();
- if ( (c >= '') && (c <= '') )
- {
- cin >> n;
- cout << "You have entered number " << n << endl;
- }
- else
- {
- cin >> str;
- cout << " You have entered word " << str << endl;
- }
- return ;
- }
peek()举例
putback(char):
调用方式:cin.putback(ch)
功能:将前面用get或者getline函数从输入流中读取的字符ch返回到输入流,插入到当前指针的位置,供后面读取。
- using namespace std;
- int main () {
- char c;
- int n;
- char str[];
- cout << "Enter a number or a word: ";
- c = cin.get();
- if ( (c >= '') && (c <= '') )
- {
- cin.putback (c);
- cin >> n;
- cout << "You have entered number " << n << endl;
- }
- else
- {
- cin.putback (c);
- cin >> str;
- cout << " You have entered word " << str << endl;
- }
- return ;
- }
putback()举例
写文件:
put():向流写入一个字符。
其原型:ofstream &put(char ch)
操作举例:file1.put('c');就是向流写一个字符'c'。
putchar():
调用方式:putchar(c)——加上头文件#include <stdio.h>或#include "stdio.h"。
说明:当c为一个被单引号(英文状态下)引起来的字符时,输出该字符(注:该字符也可为转义字符);
当c为一个介于0~127(包括0及127)之间的十进制整型数时,它会被视为对应字符的ASCII代码,输出该ASCII代码对应的字符;
当c为一个事先用char定义好的字符型变量时,输出该变量所指向的字符。
返回值:正确即为字符;错误即EOF文件结束符。
功能:向终端输出一个字符。
文件定位:
seekg():对读定位,设置输入文件流的指针位置。有两个参数,第一个是偏移量(正表示向后偏移,负表示向前偏移),第二个是基地址。
seekp():对写定位,设置输出文件流的指针位置。
函数原型:
ostream& seekp( streampos pos );
ostream& seekp( streamoff off, ios::seek_dir dir );
istream& seekg( streampos pos );
istream& seekg( streamoff off, ios::seek_dir dir );
分析:
函数参数
pos:新的文件流指针位置值
off:需要偏移的值
dir:搜索的起始位置
dir参数用于对文件流指针的定位操作上,代表搜索的起始位置
在ios中定义的枚举类型:
enum seek_dir {beg, cur, end};
每个枚举常量的含义:
ios::beg:文件流的起始位置
ios::cur:文件流的当前位置
ios::end:文件流的结束位置
注:这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。
tellg()函数不需要带参数,它返回当前定位指针的位置,也代表着输入流的大小。
而tellp()函数用于写文件时。
ofstream和ifstream详细用法的更多相关文章
- (转载)C++ ofstream和ifstream详细用法
原文出自[比特网],转载请保留原文链接:http://soft.chinabyte.com/database/460/11433960.sh [导读] ofstream是从内存到硬盘,ifstream ...
- 转载:ofstream和ifstream详细用法
ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间; 在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O, ...
- C++ ofstream和ifstream详细用法
转载地址:http://soft.chinabyte.com/database/460/11433960.shtml ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就 ...
- 转载:fstream和ifstream详细用法
文件 I/O 在C++中比烤蛋糕简单多了.在这篇文章里,我会详细解释ASCII和二进制文件的输入输出的每个细节,值得注意的是,所有这些都是用C++完成的. 一.ASCII 输出 为了使用下面的方法, ...
- C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法
C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx ...
- 在DOS下的DEBUG命令的详细用法
在DOS下的DEBUG命令的详细用法 名称 解释 格式 a (Assemble) 逐行汇编 a [address] c (Compare) 比较两内存块 c range address d (Dump ...
- __declspec关键字详细用法
__declspec关键字详细用法 __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与extern等是C和C++语言的ANSI ...
- CString.Format的详细用法(转)
CString.Format的详细用法(转) 在MFC程序中,使用CString来处理字符串是一个很不错的选择.CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的字符串.CS ...
- IFRAM的详细用法
IFRAM的详细用法: IFRAM的详细用法: <IFRAME>用于设置文本或图形的浮动图文框或容器. BORDER <IFRAME BORDER="3"& ...
随机推荐
- yoman搭建你的react-webpack应用
还没有npm和node的要提前做好准备工作 做好这一切之后 我们安装yo,记住安装在全局变量中,我们需要用他的命令工具 npm install -g yo 接下来安装yo提供的react-webpac ...
- 8_陀螺仪MPU6050和PWM控制在STM32F4-Discovery开发板上的实现
非常早曾经就把圆点博士的程序从STM32F103移植到STM32F4_Discovery (STM32F407), battery.陀螺仪和PWM电机控制的程序都已经測试完成,执行有一段时间,正常.以 ...
- mvc模型绑定问题
public void AddDesk(x_s_desk x_s_desk) 绑定的到 public void AddDesk(x_s_desk desk) 绑定不到 目前不知道原因 且仅有部分模型需 ...
- 汇编里的IMPORT和EXPORT
IMPORT ,定义表示这是一个外部变量的标号,不是在本程序定义的EXPORT ,表示本程序里面用到的变量提供给其他模块调用的.以上两个在汇编和C语言混合编程的时候用到刚看到一篇不错的BLOG,解说C ...
- SVN Client API的.net 接口 SharpSvn介紹 Checkout操作实例
Subversion是一個文件版本管理工具, 廣泛的被大家採用來作為源代碼版本管理. 已有的工具不管是其自帶的命令行工具還是Windows UI的tortoiseSVN等還是很方便實用的, 但是如果想 ...
- Atitit. Ati IDE 开发平台的第一版规划
Atitit. Ati IDE 开发平台的第一版规划 1. 增加业务类型复杂类型内置1 1.1. 简单类型string int float自动类型转换以及2 1.2. $变量str连接2 2. Dsl ...
- 几个div并列显示效果消除之间的间隔
今天在做一个静态页面时,头部的广告条是很大一张图片,考虑到网页访问时的加载速度,因此需要把一幅图拆成几个尺寸较小的图片来作为背景图,但是采用div来布局时,出现了div不能显示在一行的情况,所以开始想 ...
- linux学习之缓存机制
linux中的缓存机制 在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回 ...
- is char signed or unsigned?
工作这么多年,一直认为char是有符号的,而事实上gcc和vs默认也是有符号,但是c规范里实际并没有指明char是有符号还是无符号,所以char比较特殊, char signed char unsig ...
- 做自己生活的导演:华为CameraKit为你加持大师光环
今年最流行的娱乐方式,无疑是短视频,抖音等短视频平台,越来越多的消费者沉浸其中.除了看别人拍的短视频用以丰富生活乐趣之外,也有不少跃跃欲试的消费者加入到短视频拍摄的行列中.随着拍摄者的增加,对拍摄设备 ...