考考你的基础知识:C++ 文件操作ofstream、ifstream使用

测试平台:XP+VS2008,win32控制台程序consoletest

利用ofstream文件的输出操作

#include <fstream>
using namespace std;

int main()
{
    ofstream ocout("test.txt");
    ocout<< "Hello,world!";
    ocout.close();
    return 0;
}

生成文件test.txt,其内容为:

利用ifstream进行文件读取

1)最简单操作

预先建立test.txt,其内容为“hellow,world!”。

#include <fstream>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    ifstream icin("test.txt");
    char temp[50];
    icin >> temp;
    cout << temp<< endl;
    return 0;
}

2)增强操作

1) 中代码的缺陷就是如果test.txt内容改为“hellow world!",则会丢失空格后字符。如下图:

原因在于:C++的插入操作符只要一遇到空字符便会停止输出。这里的空字符就是空格,或者是’\0’。修改1)代码,使用getline()函数

#include "stdafx.h"
#include <fstream>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    ifstream icin("test.txt");
    char temp[50];
    //icin.getline(temp, sizeof(temp));// 代码sizeof(temp)是有缺陷的。程序之所以可以有
                                       // 正确结果是因为每个字符sizeof(temp[0])为1。
    icin.getline(temp, sizeof(temp)/sizeof(temp[0]));
    cout<< temp << endl;
    return 0;
}

得到输出结果为:

3)再看一个例子:首先输入一段话,然后将其输出到文件

#include <fstream>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	const int num = 255;
	char temp1[num] = {0};
	char temp2[num] = {0};
	const char*file = "text.txt";

	ofstream f_out(file);
	cout << "请输入文本的内容:\n";
	cin.getline(temp1, sizeof(temp1)/sizeof(temp1[0]), 0);
	f_out<< temp1;
	f_out.close();
	
	ifstream f_in(file);
	f_in.getline(temp2, sizeof(temp2)/sizeof(temp2[0]), 0);
	cout<< temp2 << endl;
	f_in.close();
	return 0;
}
cmd窗口输入

Hi,what's your name?

My name is Bob.

It's nice to meet you.

输出结果如下:

字符串输入结束时,按ctrl+z输入了^Z。这表示输入终止(EOF标志代表空--0--字符),即代码geline第三个参数值。输出窗口多一个空行出来,是代码cout<< temp2<< endl;红色部分的原因。

补充(2013/02/02):

关于求数组元素个数问题,还是有点意思的。

对char temp[50];在后续代码中我们可能要根据数组长度进行某种操作

比如:

          for(int i = 0; i < 50; i++)

          {

                ...

          }

很明显上述代码是很不规范的,是典型的“硬编码”,应该竭力避免。这里就出现了如何在for循环代码中求数组(temp)长度(元素个数)问题。

备注<20.13.2.19>:硬编码是指在软件 实现 上,把输出或输入的相关参数 (例如:路径、输出的形式、格式)直接硬编码在源代码 中,而非在运行时期由外界指定的设置、资源、数据、或者格式做出适当回应。

通常做法是:

    int nsize = sizeof(temp)/sizeof(temp[0]);

上述代码在大部分情况下是正确的,但是temp不是数组名而是指针时,上述代码就会出错,因此就有了chrome源码的新写法(Google代码规范)。

template<typename T, size_t N>
char (&ArraySizeHelper(T (&array)[N]))[N];
#define arraysize(array) (sizeof(ArraySizeHelper(array)))

这前后两段代码的区别在哪里呢?

这是因为前者存在瑕疵:当我们传给sizeof()的不是数组名,而是指针的时候,sizeof()不会在编译的时候报错!它会得出错误的结果并且继续运行!而后者改进了前者存在的瑕疵,当我们将一个指针传给arraysize的时候,它会在编译期报错。

附:sizeof()介绍

sizeof(...)是运算符,在头文件中typedefunsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。

它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。

由于在编译时计算,因此sizeof()不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
    具体而言,当参数分别如下时,sizeof()返回的值表示的含义如下:
    数组——编译时分配的数组空间大小;
    指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
    类型——该类型所占的空间大小;
    对象——对象的实际占用空间大小;
    函数——函数的返回类型所占的空间大小。函数的返回类型不能是void


补充说明(2013.2.21):

在CSDN上还有一篇介绍这两个函数的,比较详细。请仔细参阅。fstream和ifstream详细用法 。呵呵,这篇文章让我深入明白了<<与>>的含义,不错的一篇文章,这里推荐下。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值