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详细用法的更多相关文章

  1. (转载)C++ ofstream和ifstream详细用法

    原文出自[比特网],转载请保留原文链接:http://soft.chinabyte.com/database/460/11433960.sh [导读] ofstream是从内存到硬盘,ifstream ...

  2. 转载:ofstream和ifstream详细用法

    ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间; 在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O, ...

  3. C++ ofstream和ifstream详细用法

    转载地址:http://soft.chinabyte.com/database/460/11433960.shtml ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就 ...

  4. 转载:fstream和ifstream详细用法

    文件 I/O 在C++中比烤蛋糕简单多了.在这篇文章里,我会详细解释ASCII和二进制文件的输入输出的每个细节,值得注意的是,所有这些都是用C++完成的. 一.ASCII 输出 为了使用下面的方法, ...

  5. C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法

    C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx ...

  6. 在DOS下的DEBUG命令的详细用法

    在DOS下的DEBUG命令的详细用法 名称 解释 格式 a (Assemble) 逐行汇编 a [address] c (Compare) 比较两内存块 c range address d (Dump ...

  7. __declspec关键字详细用法

    __declspec关键字详细用法 __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与extern等是C和C++语言的ANSI ...

  8. CString.Format的详细用法(转)

    CString.Format的详细用法(转) 在MFC程序中,使用CString来处理字符串是一个很不错的选择.CString既可以处理Unicode标准的字符串,也可以处理ANSI标准的字符串.CS ...

  9. IFRAM的详细用法

    IFRAM的详细用法:   IFRAM的详细用法:  <IFRAME>用于设置文本或图形的浮动图文框或容器. BORDER <IFRAME BORDER="3"& ...

随机推荐

  1. 最小生成树之Prim(普里姆)算法

    关于什么是Prim(普里姆算法)? 在实际生活中,我们常常碰到类似这种一类问题:如果要在n个城市之间建立通信联络网, 则连通n个城市仅仅须要n-1条线路.这时.我们须要考虑这样一个问题.怎样在最节省经 ...

  2. SQL Server 2016 Community Technology Preview 3.3

    https://www.microsoft.com/en-us/evalcenter/evaluate-sql-server-2016 SQL Server 2016 Community Techno ...

  3. 2014秋C++第5周项目1參考-见识刚開始学习的人常见错误

    课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,实践要求见http://blog.csdn.net/sxhelijian/a ...

  4. 关于行内元素之间有空隙的问题,例如span与input之间

    问题如图: 想要的是下面的效果,而却出现上面的效果,解决方法如下: 对于行元素span或者input来说 很多人会用inline-block来显示他们,但是往往发现  中间会留一段小空隙 , 其实这个 ...

  5. RabbitMQ实战:理解消息通信

    RabbitMQ是一个开源的消息代理和队列服务器,可以通过基本协议在完全不同的应用之间共享数据,可以将作业排队以便让分布式服务进行处理. 本篇介绍下消息通信,首先介绍基础概念,将这些概念映射到AMQP ...

  6. Atitit. atiJavaExConverter4js  新的特性

    Atitit. atiJavaExConverter4js  新的特性 1.1. V1新特性1 1.2. V2 新特性1 2. Keyword1 3. Catch1 4. Convert n Thro ...

  7. Windows GDI 映射模式(出自:Windows程序设计第5版-珍藏版)

    GDI映射模式(mapping mode):和映射模式紧密相关的还有4个其它的设备环境属性:1.窗口原点(window origin)2.视口原点(viewport origin)3.窗口范围(win ...

  8. valgrind的编译和使用

    ubuntu 平台: valgrind 3.8.1 一. 编译 ./configure --prefix=/home/frank/test/valgrind/PC/local 报错:checking ...

  9. PLSQL快捷键设置

    1.在PL/SQL Developer中编写sql语句时,如果无法自动提示字段那是一件痛苦的事情,工作效率又低,在此演示下如何在PL/SQL Developer工具中自动提示字段,让开发者省时又省心, ...

  10. 实战Jquery(二)--能够编辑的表格

    今天实现的是一个表格的样例,通过获取表格的奇数行,设置背景色属性,使得奇偶行背景色不同.这个表格能够在单击时编辑,回车即更改为新输入的内容;ESC还原最初的文本.表格的实现思路非常清晰,仅仅是在实现的 ...