18年12月第1周 周志

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)

注意:函数的重载都要进行声明

 

 

 

转载于:https://my.oschina.net/u/4005274/blog/2980398

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值