Think in in C++[vol2]【4】输入输出流

1.fputs()与f.gets()

  • fputs(): C 库函数 int fputs(const char *str, FILE *stream) 把字符串写入到指定的流 stream 中,但不包括空字符。
int fputs(const char *str, FILE *stream)
#include <stdio.h>

int main ()
{
    
    
   FILE *fp;

   fp = fopen("file.txt", "w+");

   fputs("这是 C 语言。", fp);
   fputs("这是一种系统程序设计语言。", fp);

   fclose(fp);
   
   return(0);
}
  • fgets():
#include <stdio.h>

int main()
{
    
    
   FILE *fp;
   char str[60];

   /* 打开用于读取的文件 */
   fp = fopen("file.txt" , "r");
   if(fp == NULL) {
    
    
      perror("打开文件时发生错误");
      return(-1);
   }
   if( fgets (str, 60, fp)!=NULL ) {
    
    
      /* 向标准输出 stdout 写入内容 */
      puts(str);
   }
   fclose(fp);
   
   return(0);
}

2.文件输入输出流ifstream与ofstream

  • 注意: fstream.get() 与 string.get() 是两个不同的函数
  • in.get(buf, sz): 读取sz-1个字符到缓冲区buf过程中遇到了第3个参数(默认为’\n’)所规定的字符时,在缓冲区中写入零结束符,并不会将’\n‘写入缓冲区。 //Leaves \n in input
    然后使用 in.get(): 读取输入流的’\n‘,相当于跳过了它
while(in.get(buf, sz)) {
    
    	//Leaves \n in input
			in.get();	//Throw away next character(\n)
			cout << buf << endl; //Must add \n
			//File output just like standard I/O
			out << i++ << ":" << buf << endl;
		}
  • in.getline(): 遇到输入流中的结束字符(第3个参数默认为’\n‘),会将其除去。尽管getline()与get()一样在缓冲区中写入字符零,但它不在缓冲区插入结束字符。
ifstream in("Strfile.out")
	while(in.getline(buf, sz)) {
    
     //Removes \n
		char* cp = buf;
		while(*cp != ':')
			++cp;
		cp +=2;
		cout << cp << endl;
	}

3.打开模式

通过覆盖构造函数的默认参数,可以控制文件的打开模式。下表说明了控制文件打开模式的标志:

标志 功能
ios::in 打开输入文件。将这种打开模式应用于ofstream可以使得现存文件不被截断
ios::out 打开输出文件。将这种模式应用于ofstream,而且没有使用ios::appios::ateios::trunc模式
ios::app 打开一个仅用于追加的输出文件
ios::ate 打开一个已存在文件(输入或输出),并把文件指针指向文件末尾
ios::trunc 如果文件存在,则截断旧文件
ios::binary 以二进制方式打开文件。默认打开为文本方式

4.两种在输入输出流中定位的方法

  • (1)绝对定位:使用streampos进行绝对流位置定位,需要先调用一个“告知”函数,以便知道流指针在流中的确切位置:对于ostream调用tellp(),对于istream调用tellg(),对于ostream调用tellp()(p-pull写指针,g-get读指针)。
    这个函数返回streampos,用于定位流指针,对istream对象调用seekg(),对ostream对象调用seekg()
  • (2)**相对定位:**使用重载版本的seekp()和seekg()函数。函数的第1个参数是要移动的字符数目(左正右负)。第2个参数是移动方向:
ios::beg 流的开始位置
ios::cur 流的当前位置
ios::end 流的末端位置

猜你喜欢

转载自blog.csdn.net/qq_43118572/article/details/113770706