【CPP基础】输入和输出相关(二)

引自与曾今的导师Dr. Collete Heig的一次例会交谈,虽然您已离开原本的岗位,但期望您一切安好:

我们选择research作为毕生的事业及选择作为一名工程师的原因,不正是因为喜欢这种单纯而充满激情的生活嘛。

 

4. C++中的cin.ignore ()cin.getline ()函数:

4.1 cin.ignore ()函数

4.1.1 cin.ignore (a, ch)方法是从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到a或者被抛弃的字符是ch,则cin.ignore ()函数执行终止;否则它继续等待

4.1.2 它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。

4.1.3 例如:cin.ignore (1024, ‘\n’); 通常把第一个参数设置得足够大,这样实际上总是只有第二个参数'\n'起作用,所以这一句就是把回车(包括回车)之前的所以字符从输入缓冲(流)中清除出去

【CPP基础】输入和输出相关(二)_第1张图片  【CPP基础】输入和输出相关(二)_第2张图片

4.1.4 如果cin.ignore()不给参数,则默认参数为cin.ignore(1,EOF),即把EOF前的1个字符清掉,没有遇到EOF就清掉一个字符然后结束,会导致不正确的结果,因为EOF是文件结束标识。

4.2 cin.getline ()函数

4.2.1 此函数会一次读取多个字符(包括空白字符)。它以指定的地址为存放第一个读取的字符的位置,依次向后存放读取的字符,直到读满N-1个,或者遇到指定的结束符为止。若不指定结束符,则默认结束符为'\n'。

4.2.2 语法为:cin.getline (字符指针(char*),字符个数N(int),结束符(char));

【CPP基础】输入和输出相关(二)_第3张图片  【CPP基础】输入和输出相关(二)_第4张图片  【CPP基础】输入和输出相关(二)_第5张图片

5. C++中的cin.get() 和 cin.peek()函数:

5.1 cin.get()函数

  • 基本函数形态为:cin.get(字符数组名,接收长度,结束符)
  • 其中结束符意味着遇到该符号结束字符串读取,默认为ENTER,读取的字符个数最多为(长度-1),因为最后一个为"\n"。要注意的是,cin.get()操作遇到结束符停止读取,但并不会将结束符从缓冲区丢弃
  • 关于cin.get()函数有几个特点:

1)接收一个字符ch=cin.get()cin.get(char ch),二者等价

2)接收一定长度的字符串cin.get(字符数组名,接收长度,结束符),结束符为可选参数,默认为Enter,可以接受Space 、Tab,对于结束符的处理要注意,结束符并不会丢掉

3)cin.get( ),注意此时没有参数可用于舍弃,输入流中的不需要的字符或者舍弃回车,弥补cin.get(字符数组名,字符数目,结束符)的不足。

【CPP基础】输入和输出相关(二)_第6张图片  【CPP基础】输入和输出相关(二)_第7张图片

5.2 cin.peek()函数

5.2.1 cin.peek()函数其返回值是一个char型字符,返回值是指针指向的当前字符, 但是只是观测,指针任停留在当前位置,并不后移.如果要访问的字符是文件结束符,则函数值是EOF(-1)。

5.2.2 功能:从输入流中读取一个字符,但是该字符并未从输入流中删除,如果把输入流比作栈类,那么这里的peek函数就相当于栈的成员函数top,而cin.get()相当于栈的成员函数pop()。

6. C++中的cin.gcount()cin.read()函数:

6.1 cin.gcount():计数。

6.2 cin.read():读取指定长度的内容。

7. C++中的cout.precision()cout.width()函数:

7.1 cout.precision():cout.precision(val)就是在输出的时候设定输出值以新的浮点数精度值显示,即小数点后保留val位。

7.2 cout.width():规定输出的长度。

【CPP基础】输入和输出相关(二)_第8张图片  【CPP基础】输入和输出相关(二)_第9张图片

8. C++中输入和输出相关函数小结

函数基本形式

说明

cin

 

cout

要注意使用结束endl

cin.ignore (计数量(N), 结束符(char))

忽略N次直到char

cin.getline (字符指针(char*),字符个数N(int),结束符(char))

获取N-1个字符或到结束符

cin.get(字符数组名(char*),接收长度(N),结束符(char))

比getline少一个结束符

cin.peek()

从输入流拷贝一个字符

cin.gcount()

计数

cin.read()

读取指定长度的内容

cout.precision(val)

小数点后保留val位

cout.width()

规定输出的长度

9. C代码分析:(对比C和CPP在实现和思想上的差异)

【CPP基础】输入和输出相关(二)_第10张图片

【CPP基础】输入和输出相关(二)_第11张图片

9.1 argcargv[]

9.1.1 在程序中,main函数有两个参数,整型变量argc字符指针数组argv[]

9.1.2 argc的含义是程序的参数数量包含本身

9.1.3 argv[]的每个指针指向命令行的一个字符串,所以argv[0]指向字符串”copyFile.exe”。argv[1]指向字符串sourceFile,argv[2]指向字符串destFile。

9.2 inout是两个文件指针,它们的类型都是FILE*,分别作为I/O流对象使用。

9.3 if(arc != 3)是为了确保程序参数个数的正确性。

9.4 通过fopen()函数,以二进制可读/可写方式打开两个文件并返回两个文件指针给in和out。

9.5 为了确保文件成功打开,需要对fopen()的返回值进行检查,如果打开失败,就像标准错误流stderr发送一条消息。

9.6 getc()函数一次从输入流(stdin)读取一个字符,putc()函数把这个字符写入到输出流(stdout)。

9.7 当getc()遇到文件结束标志的时候,函数就返回EOF。EOF是一个宏,在stdio.h中定义,其值为一个负数,通常是-1。

9.8 EOF(End of File事实上有两个含义:当文件读取错误,或者文件结束时都会返回EOF。

9.9 注意细节:getc()的返回值是int类型,所以代码中声明的ch也是int类型,不是char类型。

9.10 int fprintf(FILE *stream,const char *format,[argument]

FILE*stream:文件指针const char* format:输出格式[argument]:附加参数列表。fprintf( )会根据参数format 字符串来转换并格式化数据, 然后将结果输出到参数stream 指定的文件中, 直到出现字符串结束('\0')为止。

10. C++的文件操作

【CPP基础】输入和输出相关(二)_第12张图片

【CPP基础】输入和输出相关(二)_第13张图片

10.1 两个例子都使用了open函数来完成打开文件操作。但这不是唯一的办法,还可以采用:

ifstream.in ( “Text.txt” ); 和 ofstream.out ( “Text.txt” );

※ 这两者在创建 ”ifstream” 和 ”ofstream” 类对象时,将文件的名字传递给他们的构造函数

※ 构造函数就是对象默认使用的函数(方法)。

10.2 事实上,构造函数还可以接受不止一个参数:

filename表示文件的名称,它是一个字符串;open_mode表示打开模式,其值用来定义以怎样的方式打开文件(跟open的参数一样)。

※ 以下给出几种常见的打开模式:

  • ios::in ( 打开一个可读取文件 )
  • ios::out ( 打开一个可写入文件 )
  • ios::binary ( 以二进制的形式打开一个文件 )
  • ios::app ( 写入的所有数据将被追加到文件的末尾 )
  • ios::trunk ( 删除文件原来已存在的内容 )
  • ios::nocreate ( 如果打开的文件不存在,那么一次参数调用open函数将无法进行 )
  • ios::noreplece ( 如果要打开的文件已存在,试图用open函数打开时将返回一个错误 )

【CPP基础】输入和输出相关(二)_第14张图片

【CPP基础】输入和输出相关(二)_第15张图片

10.3 使用“|”操作符可以实现同时使用多种打开方式

 

 

你可能感兴趣的:(CPP基础)