文章目录
  1. 1. 1、缓冲区
  2. 2. 2、读写文件
  3. 3. 3、刷新缓冲区的时机
  4. 4. 4、eof()和peek()区别
  5. 5. 5、流指针定位
  6. 6. 6、主要函数说明

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()是一样的!

文章目录
  1. 1. 1、缓冲区
  2. 2. 2、读写文件
  3. 3. 3、刷新缓冲区的时机
  4. 4. 4、eof()和peek()区别
  5. 5. 5、流指针定位
  6. 6. 6、主要函数说明