测试平台: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(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
由于在编译时计算,因此sizeof()不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
具体而言,当参数分别如下时,sizeof()返回的值表示的含义如下:
数组——编译时分配的数组空间大小;
指针——存储该指针所用的空间大小(存储该指针的地址的长度,是长整型,应该为4);
类型——该类型所占的空间大小;
对象——对象的实际占用空间大小;
函数——函数的返回类型所占的空间大小。函数的返回类型不能是void。
补充说明(2013.2.21):
在CSDN上还有一篇介绍这两个函数的,比较详细。请仔细参阅。fstream和ifstream详细用法 。呵呵,这篇文章让我深入明白了<<与>>的含义,不错的一篇文章,这里推荐下。