文章目录
1、缓冲区
不管是输入还是输出,为了减少刷内存操作,一般都有一个缓冲区的,所以一般情况下都是先缓冲到缓冲区,
当缓冲区满的时候、文件关闭或者手动刷新的时候才会读写到终端
1.1输出函数区别
cout << flush:刷新缓冲区到终端(<<操作符具有调用函数指针的作用)== cout.flush()
cout<<endl:换行+刷新缓冲区到终端 == cout<<”n”<<flush
cout<<”n”:只有换行的作用,有缓冲区,至于什么时候刷新与操作系统有关,所以一般就使用cout<<endl;
printf:没有缓冲区,直接写到终端
2、读写文件
2.1如果文件不是以in的模式打开,那么就会在不存在的时候创建,如果是in的时候,读取,不存在创建也是空文件,
所以是没有意义的,所以不存在是不会创建的!
app如果是以这种模式打开文件的话,文件指针就是在文件末尾!
2.2、fstream
Ifstream | ofstream fs(file_name):这种是以默认方式(out)打开文件,因为其构造函数中调用了默认的open()函数
或者fs.open()无返回值 if failure the the failbit state flag is set for the stream
fs<< <<endl;(一定要加endl,否则只是写在缓冲区中)
2.3、stdio.h
FILE * file_fd;
File_fd = fopen();
fprintf(file_fd,format,data);关闭文件的时候刷新或者缓冲区满的时候
问题:串行
解决:写之后fseek(file_fd,0,SEEK_END)
3、刷新缓冲区的时机
- endl
- flush()
- close()
- 程序结束
- 缓冲区满
- 原本是输出缓冲区转换成输入缓冲区
4、eof()和peek()区别
4.1.EOF()标志位定义在stdio.h中,#define EOF (-1)
所以EOF并不是文本中的一个结束符
不管是使用get()或者getc()的时候如果返回-1,就是到达文件末尾了
返回-1的场景有读取异常;到达文件末尾(已经读取的大小和文件大小比较)
当get(c)是最后一个字节的时候,此时可以读取到字符,所以不返回-1,但是再次读取的时候就返回-1了
4.2.peek()
源码中是通过sgetc()进行预读的,也就是说如果缓冲区的字符如果为空,就返回-1,在读取当前字符的情况下
5、流指针定位
seekg()设置文件指针到达指定位置
tellg()获取当前文件指针的位置
6、主要函数说明
6.1 fstream get()
返回值,返回这个字符在流中的地址
当没有字符的时候返回NULL(‘n’也算一个字符,正常的行末尾是有换行符的)
当读到最后一个字符的时候就设置了EOF标志位
6.2 fstream getline(buf, length,delmi)
默认分隔符是’n’
返回值和get()一样
读取length个字符或者遇到分隔符,或者文件末尾就返回
内部实现是使用getc(),所以和get()是一样的!
原文地址:https://www.cnblogs.com/petewell/p/11601776.html
时间: 2024-10-07 15:04:29