C语言_标准I/O库

<stdio.h>

文件操作标准I/O库函数:

fopen、fread、fwrite、fclose、fflush、fseek、fgetc、getc、getchar、fputc、putc、putchar、fgets、gets、printf、fprintf、sprintf、scanf、fscanf、sscanf、fgetops、fsetops、ftell、rewind、freopen、setvbuf、remove、fileno、fdopen

目录操作标准I/O库函数:

opendir、readdir、telldir、seekdir、closedir

 

1、流(stream):任意输入的源或任意输出的目的地。

2、文件指针(file pointer): FILE *

3、三种标准流:

文件指针    流     默认含义

stdin   标准输入   键盘

stdout  标准输出   屏幕

stderr  标准出错   屏幕

printf、scanf、putchar、getchar、puts、gets都是通过stdin获得输入,并且由stdout进行输出。

4、支持文本文件和二进制文件

5、标准IO :
特点带缓存,操作效率高

(1)行缓冲:对于终端操作采用的缓冲区 
     缓存区大小: 1024字节(1K)
     刷新缓存  :程序正常结束、缓存区满、 ’\n’ 、使用fflush函数
(2)全缓冲:对于文件操作采用的缓冲区
     缓存区大小:4096字节(4K)
     刷新缓存  :程序正常结束、缓存区满、使用fflush函数
(3)无缓冲:对于终端操作采用的缓冲区
     标准出错(stderr)

【1】fopen-- 用于打开一个文件,返回一个指向该文件的文件指针

#include<stdio.h>
FILE *fopen(const char *filename, const char *mode);

参数说明:
  filename -- 指定了被打开的文件的路径(相对路径或绝对路径)
  mode (模式)-- 指定了被打开文件的操作方式,如下:
    "r"    --  只读
    "w"   --  只写,并将文件截断为0
    "a"    --  只写,以追加方式从文件尾开始写
    "r+"      --  读写
    "w+"    --   读写,并将文件截断为0
    "a+"     --  读写,以追加方式从文件尾开始写
fopen执行成功时返回指向被打开文件的文件流指针,失败时返回NULL。

int main(int argc, const char *argv[])
{
	FILE * fp;
	if((fp = fopen("file.txt", "w")) == NULL) 		//打开一个文件,得到一个文件指针
	{
		printf("fopen error\n");
		return -1;
	}

	fprintf(fp, "1hello");
	fprintf(fp, "2hello");
	fclose(fp); 									//关闭文件
	fprintf(fp, "3hello"); 							//写不进去
	
	return 0;
}



【2】fclose -- 断开一个文件流指针与文件的关联

#include<stdio.h>
int fclose(FILE *stream);

fclose操作将会引起所要关闭的文件流刷新缓冲区的操作,这使得该文件流上的所有读写操作都立刻执行。当程序正常终止时会对所有尚未关闭的文件流自动执行fclose操作。



【3】printf、fprintf、sprintf -- 格式化输出函数

#include<stdio.h>
int printf(const char *format, ...);
int sprintf(char *s, const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);

参数说明:
  format -- 格式字符串,它可以分为两个部分:普通字符和转换说明。普通字符原样输出,转换说明用于指定printf系列函数的输出格式,它以百分号开始,以转换字符结束,具体如下:

printf格式说明
 转换说明  输出结果
 %d,%i  输出十进制整型
 %o  输出八进制整型
 %x  输出十六进制整型
 %u  输出无符号十进制整型
 %c  输出一个字符
 %s  输出一个字符串
 %f  输出一个单精度浮点数
 %e,%E  输出一个双精度浮点数,以科学计数法的形式表示
 %g,%G  以一般格式输出一个双精度浮点数
 %p  void *类型指针(取决于具体实现)
 %%  输出一个百分号


其中d、i、o、x、X、u、……、p就是转换字符,在百分号与转换字符之间可能依次包含下列组成部分:

  • 负号     --    指定被转换的参数按照左对齐形式输出,默认为右对齐
  • 整数     --    用于指定最小字段宽度,如有必要将以空格填充以保证对齐
  • 小数点  --    用于将字段宽度与字段精度分开
  • 整数     --    用于指定精度,即字符串中要打印的最大字符数、浮点数小数点后的位数、整数最少输出的数字数目
  • 字母     --    如h用来指定打印short类型,l用来指定打印long类型
int main(int argc, const char *argv[])
{

#if 0

	fprintf(stdout, "hello world\n");  //  <==>  printf

#else
	FILE * fp;
	if((fp = fopen("file.txt", "r+")) == NULL)
	{
		printf("fopen error");
		return -1;
	}

	int a = 10;
	float b = 12.34;
	char c = 'K';
	fprintf(fp, "%d %.2f %c\n",a, b, c);

	fclose(fp);
#endif
	
	return 0;
}



【4】scanf、fscanf、sscanf -- 格式化输入函数
#include<stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(char *s, const char *format, ...);

scanf系列函数的参数的作用与printf系列函数参数的作用方式十分不同,在scanf系列函数中,输入(获取变量值的源)与格式字符串之间是一种匹配的关系,只有二者匹配成功,scanf函数才有可能执行成功。比如对于scanf("Hello %d", &i)而言,它要求输入中必须以Hello单词为前导,否则将匹配失败,scanf函数就不能成功执行。格式串可能包含的部分如下:

  • 空格或制表符    --  在处理过程中将被忽略,不用于匹配
  • 普通字符        --  用于匹配输入流中的下一个非空白字符
  • 转换说明        --  依次由一个%、一个可选赋值禁止字符*、一个可选数值(指定最大字段宽度)、一个可选h或l或L字符(指定目标对象的宽度)以及一个转换字符组成

转换说明用于控制下一个输入字段的转换。通常,转换结果存放在相应的参数指向的变量中,但是如果转换说明中包含赋值禁止字符*,则跳过该输入字段,不进行赋值。输入字段定义为一个不包含空白字符的字符串,因此其边界就定义为下一个空白字符(或者到达指定的宽度)。转换字符指定对输入字段的解释,对应的参数必须是指针,scanf转换字符的解释同printf的转换字符。


【5】fgetc、getc、getchar -- 从指定文件流中读取一个字节的数据

#include<stdio.h>
int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar();

函数fgetc从指定的文件流中读取一个字节的数据,并返回该字节数据的整型值,当读到文件尾或发生错误时返回EOF(-1)。getc同fgetc,只是它有可能被实现为宏。getchar函数相当于从标准输入读取字节时的fgetc。

int main(int argc, const char *argv[])
{
#if 0
	int ret;
	ret = fgetc(stdin); 				// <==> getchar();
	printf("ret = %c\n",ret);
#else
	FILE *fp = fopen(argv[1] , "r");
	if(fp == NULL)
	{
		printf("fopen error\n");
		return -1;
	}

	int ret;
	ret = fgetc(fp);
	printf("ret = %c\n",ret);

	ret = fgetc(fp);
	printf("ret = %c\n",ret);

	fclose(fp);
#endif

	return 0;
}



【6】fputc、putc、putchar -- 写一个字节数据到指定的文件流

#include<stdio.h>
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);

fputc函数将一个字节写到指定的文件流中,成功时返回返回写入的字节的整型值,失败时返回EOF。putc同fputc,只是有可能被实现为宏。putchar相当于向标准输出写一个字节时的fputc。

int main(int argc, const char *argv[])
{
#if 0

	fputc('L', stdout);
	fputc('\n', stdout);

#else
	FILE *fp = fopen(argv[1], "r+");
	if(fp == NULL)
	{
		printf("fopen error\n");
		return -1;
	}

	fputc('A', fp);
	fputc('B', fp);
	fclose(fp);
#endif

	return 0;
}



【7】fgets、gets -- 用于从一个文件流读取一个字符串

#include<stdio.h>
char *fgets(char *s, int n, FILE *stream);
char *gets(char *s);

参数说明:
  s -- 指定存放所读取的数据的位置
  n -- 指定读取数据的最大长度(包括结尾的\0字符)
  stream -- 数据源,是一个文件指针
fgets函数从指定的文件流指针中读取一个字符串,直到遇到换行符或者已经读了n-1个字符或者遇到文件EOF,它会在所读取的数据结尾加上一个\0字符,然后放到s指定的位置。成功时返回返回指向s的指针,失败时返回NULL,并重置全局变量errno以指明失败原因。读到文件尾EOF时也返回NULL。
gets函数从标准输入流中读取一个字符串,直到遇到换行符(它会把换行符扔掉并不上一个\0字符)后返回。处于安全的考虑,建议使用fgets函数。

int main(int argc, const char *argv[])
{
	FILE *fp_r, *fp_w;

	if((fp_r = fopen(argv[1], "r")) == NULL)
	{
		printf("fp_r fopen error\n");
		return -1;
	}

	if((fp_w = fopen(argv[2], "w")) == NULL)
	{
		printf("fp_w fopen error\n");
		return -1;
	}

	char buf[32] = {0};
	while(fgets(buf, sizeof(buf), fp_r) != NULL)
	{
		fputs(buf, fp_w);
	}
	printf("copy ok\n");

	fclose(fp_r);
	fclose(fp_w);
	return 0;
}



【8】fputs -- 写一个字符串数据到指定的文件流

#include<stdio.h>
int fputs(const char *s, FILE *stream);

功能:向指定文件写入字符串,不带换行功能

 参数:s 功能:向指定文件写入字符串,不带换行功能

返回:成功返回输出的字符个数,失败EOF(-1)

int main(int argc, const char *argv[])
{
#if 0
	fputs("HelloWorld", stdout); 			//<=/=> puts
//	puts("Hello World"); 					//自带换行

#else
	FILE * fp;
	if((fp = fopen(argv[1], "w")) == NULL) 	
	{
		printf("fopen error\n");
		return -1;
	}

	fputs("hello world", fp);
	fclose(fp); 	

#endif
	return 0;
}


【9】fread -- 用于从一个文件流中读取数据

#include<stdio.h>
size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);

参数说明:
  ptr       --   指定从文件流中读取的数据所存放的地方
  size      --   指定所读取的每一条记录的大小,单位字节
  items    --   指定本次读操作所读取的记录条数
  stream  --   指定读取数据的来源————文件流
fread执行成功时返回实际读取记录的条数。

int main(int argc, const char *argv[])
{
	FILE *fp_r, *fp_w;

	if((fp_r = fopen(argv[1], "r")) == NULL)
	{
		printf("fp_r fopen error\n");
		return -1;
	}
	if((fp_w = fopen(argv[2], "w")) == NULL)
	{
		printf("fp_w fopen error\n");
		return -1;
	}

	char buf[32] = {0};
	int ret = 0;
	//size 使用单位字节长度,使得读取的数据与返回值相匹配
	while((ret = fread(buf, 1 , sizeof(buf), fp_r)) > 0)
	{
		fwrite(buf, 1, ret, fp_w);
	}

	fclose(fp_r);
	fclose(fp_w);

	return 0;
}



【10】fwrite -- 用于写数据到一个文件流中

#include<stdio.h>
size_t fwrite(void *ptr, size_t size, size_t nitems, FILE *stream);

参数的含义以及返回的结果类似于fread。需要说明的是,fread和fwrite并不适合从结构化的数据源中读取数据,一个主要原因是fwrite可移植性较差。


【11】fseek--设定文件指针位置

 int fseek(FILE *stream, long offset, int whence);
   SEEK_SET          文件起始
   SEEK_CUR          当前位置
   SEEK_END          文件最后一个字符的下一个位置
   void rewind(FILE *stream);        //将文件位置指针拉回到最开始
   long ftell(FILE *stream);         //获取当前读写的位置 

int main(int argc, const char *argv[])
{
	FILE *fp;
	fp = fopen(argv[1], "r+");
	if(fp == NULL)
	{
		printf("fopen error\n");
		return -1;
	}

#if 1
	fseek(fp, -3, SEEK_END);
	fputc('A' , fp);
	fputc('B' , fp);
#endif
	
#if 0	
	fputc('A' , fp);
	fputc('B' , fp);
	rewind(fp);  		//<==> fseek(fp, 0, SEEK_SET);
	fputc('C' , fp);
#endif

#if 0
	printf("ret = %ld\n", ftell(fp));
	fputc('A' , fp);
	fputc('B' , fp);
	printf("ret = %ld\n", ftell(fp));
#endif
	fclose(fp);

	
	return 0;
}

   


【12】ftellrewind

long int ftell(FILE *stream);   /* 返回当前读写位置的偏移量 */
void rewind(FILE *stream);      /* 重置文件流的读写位置 */






     
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值