简单文件输入/输出

  1.文本I/O和文本文件

  这里来介绍一些文本I/O的概念。使用cin进行输入时,程序将输入视为一系列的字节,其中每个字节都被解释为字符编码。不管目标数据类型是什么,输入一开始都是字符数据——文本数据。然后,cin对象负责将文本转换为其他类型。为说明这是如何完成的,来看一些处理同一个输入行的代码。

  假设有如下范例输入行:

  38.5  19.2

  来看一下使用不同数据类型的变量进行存储时,cin是如何处理该行输入行的。首先,来看使用char数据类型的情况。

  char ch;

  cin>>ch;

  输入行中的第一个字符被赋给ch。在这里,第一个字符数字是3,其字符编码(二进制)被存储在变量ch中。输入和目标变量都是字符,因此不需要进行转换。注意,这里存储的不是数值3,而是字符3的编码。执行上述输入语句后,输入队列中的下一个字符为字符8,下一个输入操作将对其进行处理。

  接下来看看int类型:

  int n;

  cin>>n;

  在这种情况下,cin将不断读取,知道遇到非数字字符。也就是说,它将读取3和8,这样句点将称为输入队列中的下一个字符。cin通过计算发现,这两个字符对应数值38,因此将38的二进制编码复制到变量n中。

  接下来看看double类型:

  double x;

  cin>>x;

  在这种情况下,cin将不断读取,知道遇到第一个不属于浮点数的字符。也就是说,cin读取3、8、句点和5,使得空格成为输入队列中的下一个字符。cin通过计算发现,这4个字符对应于数值38.5,因此将38.5的二进制编码(浮点格式)复制到变量x中。

  接下来看看char数组的情况:

  char word[50];

  cin>>char;

  在这种情况下,cin将不断读取,知道遇到空白字符。也就是说,它读取3、8、句点和5,使得空格称为输入队列中的下一个字符。然后,cin将这4个字符的字符编码存储到数组word中,并在末尾加上一个空字符。这里不需要任何转换。

  最后,来看另一种使用char数组来存储输入的情况:

  char word[20];

  cin.getline(word,50);

  在这种情况下,cin将不断读取,知道遇到换行符。所有字符都将被存储到数组word中,并在末尾加上一个空字符。这里不需要任何转换。

  对于输入,将执行相反的转换。即整数被转换为数字字符序列,浮点数被转换为,数字字符和其它字符组成的字符序列(如284.53或-1.587E+06)。字符数据不需要做任何转换。

  这里的要点是,输入一开始为文本。因此,控制台输入的文件版本是文本文件,即每个字节都存储了一个字符编码的文件。并非所有的文件都是文本文件,例如,数据库和电子表格以数值格式(即二进制整数或浮点格式)来存储数值数据。另外,字处理文件中可能包含文本信息,但也可能包含用于描述格式、字体、打印机等非文本数据。

  这里讨论的文件I/O相当于控制台I/O,因此仅适用于文本文件。要创建文本文件,用于提供输入,也可以用于文本编辑,如DOS中的EDIT,Windows中的“记事本”和UNIX / Linux系统中的vi或emacs。也可以使用文字处理程序来创建,但必须将文件保存为文本格式。IDE中的源代码编辑器生成的也是文本文件,事实上,源代码文件就属于文本文件。同样,可以使用文本编辑器来查看通过文本输出创建的文件。

  

2.写入到文本文件中


  对于文件输入,C++使用类似于cout的东西,下面来复习一些有关将cout用于控制台输出的基本事实,为文件输入做准备:

  a.必须包含头文件iostream。

  b.头文件iostream定义了一个用处理输出的ostream类。

  c.头文件iostream声明了一个名为cout的ostream变量(对象)。

  d.必须指明名称空间std; 例如,为引用元素cout和cin,必须使用编译指令using或者前缀std::。

  e.可以结合使用cout和操作符<<来显示各种类型的数据。

文件输出与此极其相似:

  a.必须包含头文件fstream。

  b.头文件fstream定义了一个用于处理输出的ofstream类。

  c.需要声明一个或多个ofstream变量(对象),并以自己喜欢的方式对其命名,条件是遵循常用命名规则。

  d.必须指明名称空间std; 例如,为引用元素ofstream,必须使用编译指令using或前缀std::。

  e.需要将ofstream对象与文件关联起来,为此,方法之一是使用open()方法。

  f.使用完文件后,应使用close()方法将其关闭。

  g.可结合ofstream对象和操作符<<来输出各种类型的数据。

  下面来看下实例:

  #include<iostream>

  #include<fstream>

  using namespace std;

  int main()

  {

ofstream a;

a.open("a.txt");

a<<"!!!!!"<<endl;

return 0;

  }

  总之,使用文件输出的主要步骤如下:

  a.包含头文件fstream。

  b.创建一个ofstream对象。

  c.将该ofstream对象同一个文件关联起来。

  d.就像使用cout那样使用ofstream对象。


  相似地,读取文本文件的主要步骤如下:

  a.包含头文件fstream。

  b.创建一个ifstream对象。

  c.将该ifstream对象与一个文件关联起来。

  d.就像使用cin那样使用ifstream对象。

  e.可以结合使用ifstream对象和get()方法读取一个字符,使用getline()来读取一行字符。

  f.可以使用eof()、fail()、等方法来判断输入是否成功!

  举例:

  

#include <iostream>
#include <fstream>
using namespce std;
int value = 0;
int main()
{
	ifstream a;
	a.open("a.txt");
	if(!a.is_open())
	{
		cout<<"Can not open this file!"<<endl;
		exit(1);
	}
	while(a.good())
	{
		value++;
		cin>>value;
	}
	if(a.fail())
	{
		cout<<"Input terminated for unknown reason!"<<endl;
	}
	a.close();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值