1. argc和argv[]:argc的含义是程序的参数数量,包含本身;argv[]的每个指针指向命令行的一个字符串
in和out是我们定义的两个文件指针,它们的类型都是FILE*,分别作为两个I/O流对象使用
if(argc!=3)是为了确保程序参数个数的正确性
通过fopen()函数,我们以二进制的形式按可读/可写方式打开两个文件,并返回两个文件指针给in和out
fclose():俗称“擦屁股”操作,防止造成资源的遗失和泄露
stderr:标准错误流
C语言里,宏定义一般是大写字母
getc()函数一次从输入流(stdin)读取一个字符,put()函数把这个字符写入到输出流(stdout)
当getc()遇到文件结束标志的时候,函数就返回EOF。EOF是一个宏,在stdio.h中定义,其值为一个负整数,通常为-1
EOF事实上有两个含义:MSDN
注意细节,getc()的返回值是int类型,所以我们声明时应该是int ch,而不是char ch
ifstream: input file stream,文件输入流,文件读取类
ofstream: output file stream,文件写入类
2. 例子:编写一个文件复制程序,功能实现讲一个文件复制到另一个文件
#include<fstream>
#include<iostream>
using namespace std;
int main()
{
ifstream in;
in.open("test.txt");
if(!in)
{
cerr<<"打开文件失败"<<endl;
return 0;
}
char x;
while(in>>x)
{
cout<<x;
}
cout<<endl;
in.close;
return 0;
}
ifstream in; in.open("test.txt");
两句等价于一句
ifstream in("test.txt");
创建ifstream类的对象时,将文件的名字传递给它们的构造函数。构造函数就是对象默认使用的函数(方法)
几种常见的文件打开模式:
ios::in:打开一个可读写文件
ios::out:打开一个可写入文件
ios::binary:以二进制形式打开文件
ios::app:写入的所有数据将被追加到文件末尾
ios::trunk:删除文件原来已存在的内容
ios::nocreate:如果要打开的文件并不存在,那么以此参数调用open函数将无法执行
ios::noreplece:如果要打开的文件已存在,试图用open函数打开时将返回一个错误
fstream fp("test.txt",ios::in |ios::out);
上面这一句中,读写可以同时进行,是因为这两个文件打开方式是由不同位进行控制的
ios::beg:使得文件指向文件头,ios::end:使得文件指向文件尾
例子:向用户提出一个"Y/N"问题,然后把用户输入的值赋值给answer变量
要求:针对用户输入‘Y’和‘y’以及'N'和'n'进行过滤
发掘程序可能存在的任何问题,想想为什么
#include <iostream>
int main()
{
char answer;
std::cout << "请问可以格式化您的硬盘吗?![Y/N]" << "/n";
std::in >> answer;
switch (answer)
{
case:'Y' :
case:'y' :
std::cout << "请勿随便格式化硬盘" << "/n";
break;
case:'N' :
case:'n' :
std::cout << "谢谢合作" << "/n";
break;
default:
std::cout << "您的输入不符合要求!!" << "/n";
break;
}
std::cin.get(100,'/n');//排除空格
std::cout << "输入任何字符结束程序!" << "/n";
std::cin.get();
return 0;
}
例子
摄氏与华氏温度的转换:
const静态变量和宏定义#define的优劣比较
#include(iostream)
int main()
{
const unsigned short ADD_SUBTRACT = 32;
const double RATIO = 9.0 / 5.0;
double tempIn, tempOut;
char typeIn, typeOut;
std::cout << "请以【xx.x C】或者[【xx.x F】格式输入任意温度:";
std::cin >> tempIn >> typeIn;//分别将数字和字符分开赋值
std::cin.ignore(100, '\n'); //清楚键盘缓冲区
std::cout << "\n";
switch (typeIn)
{
case 'c':
case 'C':
tempOut = typeIn * RATIO + ADD_SUBTRACT;
typeOut = 'F';
typeIn = 'C';
break;
case 'f':
case 'F':
tempOut = (tempIn - ADD_SUBTRACT)/ RATIO;
typeOut = 'C';
typeIn = 'F';
break;
defalut:
typeOut = 'E';
break;
}
if (typeOut != E)
{
std::cout << tempIn << typeIn
<< " = " << tempOut
<< typeOut << "\n\n";
}
else
{
std::cout << "输入错误!" << "\n\n";
}
std::cout << "请输入任何字符结束程序!" << "\n\n";
std::cin.get();
return 0;
}
不要相信任何程序的输入,尤其是用户输入的东西,这是计算机安防工作的基本准则。
要对输入数据进行合法性检查。
检查某个数值是不是正数,是不是落在了给定的范围,是不是某个特定的值。
C和C++不会对数组的越界进行检查,为了防止缓冲区溢出,因此要进行数据的合法性检查。
cin对象有几专门用来进行报告其工作情况的成员函数,它们将返回一个人真/假值来表明cin的状态
eof():如果到达文件(或输入)末尾,返回true
fail():如果cin无法工作,返回true
bad() :如果cin因为比较严重的原因(例如内存不足)而无法工作,返回true
good() :如果以上情况都没有发生,返回true。
函数的重载:用同样的名字再定义一个有着不同参数但有着同样用途的函数。
void converTemperature(double tempIn,char typeIn)
void converTemperature(int tempIn, char typeIn)
注意:函数的重载都要进行声明