标准IO:
标准IO在应用层:比文件IO高级一点,在windows也可以用
标准IO指C语言中提供的标准输入输出库文件所包含的函数。
即stdio.h文件中声明的函数,都是标准输入输出函数。
printf scanf
sprintf sscanf
fprintf fscanf
putchar getchar
puts gets
putc getc
fputs fgets
以终端为操作对象的标准IO函数:
printf();
函数原型:int printf(const char *format, …);
功能:向终端输出一个字符串。
优点:输出格式可以自定义。
scanf();
函数原型:int scanf(const char *format, …);
功能:从终端获取指定格式的数据,保存到一个变量空间中
优点:获取输入数据的格式可以指定。
缺点:如果从终端获取字符串,遇到空格结束。
puts();
函数原型:int puts(const char *s);
功能:输出一个字符串。 <仅仅只能输出字符串内容>
特点:自动在字符串末尾添加换行符
gets();
函数原型:char* gets(char *s);
功能:从终端获取一个字符串。
特点:获取字符串时,遇到换行才会结束。
获取字符串时,会一直获取,容易导致缓存区溢出。
scanf()和gets()在终端获取字符串时,特性对比:
1)scanf()函数从终端获取字符串,遇到空格结束。
2)gets()函数从终端获取字符串时,遇到换行才会结束。
3)scanf()函数从终端获取字符串时,遇到换行结束获取,不会读取换行符,换行符依旧保留在输入缓存区。
4)gets()函数从终端获取字符串时,遇到换行结束获取,最后的换行符也会读取到。读取到之后,丢弃换行符
以字符串为操作对象的标准IO函数:
sprintf();
函数原型:int sprintf(char *str, const char *format, …);
功能:把一个字符串输出到str指向的缓存区中。
用途:sprintf()主要用于字符串拼接。
例: sprintf(buf, “%s–>%s/%s %d %f is %s”, “hello”, “/dev/”, “a.txt”, …);
例子:将两个数值拼接到一个字符串
#include <stdio.h>
#include <stdlib.h>
int main()
{
char tem[128]={0};
//温湿度
int temp=25;
int hum=60;
sprintf(tem,"现在的温湿度分别是:,温度%d,湿度%d %%\r\n",temp,hum);
printf("%s\n", tem);
return 0;
}
输出结果:现在的温湿度分别是:,温度25 ,湿度60 %
sscanf();
函数原型:int sscanf(const char *str, const char *format, …);
功能:从str字符串中获取数据,根据指定格式进行获取,保存到变量空间中
<以字符串作为输入来源>
用途:数据类型转换。 把字符串转换为整型/浮点型/字符型数据
以文件为操作对象的标准IO函数:
fprintf();
函数原型:int fprintf(FILE *stream, const char *format, …);
功能:把一个字符串输出到stream指向文件中。对文件进行写操作!
fscanf();
函数原型:int fscanf(FILE *stream, const char *format, …);
功能:从stream指向的文件中获取数据,经过格式转换之后,保存到变量空间中。读操作!
<以文件作为数据输入来源>
fputs();
函数原型:int fputs(const char *s, FILE *stream);
功能:把字符串s输出到stream指向的文件中。 对文件的写操作
<输出重定向到文件中>
fgets();
函数原型:char * fgets(char *s, int size, FILE *stream);
功能:从stream指向文件中获取数据,最大获取size-1个,把获取到的数据保存在s指向的缓存区。
<对文件的读操作>
形参:
s:存放获取到数据的缓存区
size:最大获取数据的字节个数-1。
stream:数据获取的来源。 <文件/终端>
返回值:
成功:获取到的字符串首地址
失败:NULL
对文件写操作 对文件读操作
fpirntf(); fscanf();
fputs(); fgets();
重要!标准IO中的文件流指针
文件流指针:FILE*
在标准IO对文件进行操作的时候,使用文件名称是不能准确指定一个文件,要用文件流指针。
这里使用文件流指针去指定要操作的文件空间。
文件流指针和文件描述符特性几乎相同!
文件流指针比文件描述符多了一个缓存特性!
文件流指针中:
stdin:标准输入 stdout:标准输出 stderr:标准异常(都是地址)
文件流结构体:
标准IO中的标准文件操作函数
标准IO 文件IO
fopen open
fclose close
fseek ,rewind lseek
fread read
fwrite write
ftell
fopen();
函数原型:FILE* fopen(const char *path, const char *mode);
路径 读写方式(等同于open的flags)
函数功能:根据提供的文件名,得到对应的文件流指针,通过返回值返回。
形参列表:
path:带路径的文件名
mode:对文件的操作方式
“r” :只读 <不能创建文件> 文件必须存在
“w” :只写 <清空写> <能够创建文件>
“a” :只写 <追加写> <能够创建文件>
+读写方式
“r+” :读写 <覆盖写> <不能创建文件>
“w+”:读写 <清空写> <能够创建文件>
“a+” : 读写 <追加写> <能够创建文件>
操作总结:
返回值:
成功:文件对应的文件流指针 – fp
失败:NULL
#include <stdio.h>
int main (int argc, char*argv[])
{
if(argc!=2)
{
printf("请使用格式:%s 文件名\n ",argv[1]);
return -1;
}
FILE *fp= fopen(argv[0], "r");
if(fp == NULL)
{
printf("文件 %s不存在\n",argv[1]);
return -2;
}
printf("成功打开文件%s \n",argv[1]);
return 0;
}
fread();
函数原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE stream);
函数功能:从stream指向的文件中最大读取sizenmemb个字节的数据,存放到ptr指向的缓存区中
形参列表:
读到哪: ptr:缓存区 --> 存放从文件中读取到的数据
读多少: size:一块数据的字节数 (一次读取一块数据)
一次读多少块: nmemb:最大读取的块数
从哪读: stream:文件流指针 --> 指向要操作的文件
返回值:
成功:实际读取到的完整的块数
失败:负数
fwrite();
函数原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
函数功能:提取ptr缓存区中存放的数据,写入到stream指向的文件中,最大写入size * nmemb个字节数据
形参列表:
ptr:缓存区 --> 存放着要写入文件的数据
size:一块数据的字节数 (一次写一块数据),一般写1
nmemb:最大写入的块数 <实际写入文件的块数>
stream:文件流指针 --> 指向要操作的文件
返回值:
成功:实际写入文件数据的完整的块数
失败:负数
fseek();
函数原型:int fseek(FILE *stream, long offset, int whence);
函数功能:对文件偏移指针重新定位
形参列表:
stream:文件流指针 – 表示要操作的文件
offset:相对于基准点的偏移距离 (负数:向前偏移 正数:向后偏移)
whence:
重新定位文件偏移指针的基准点
SEEK_SET :
文件开头
SEEK_CUR:
文件偏移指针当前位置
SEEK_END:
文件末尾
返回值:
成功:0 失败:-1
ftell();
函数原型:long ftell(FILE *stream);
函数功能:返回文件偏移指针当前位置到文件开头的距离
形参列表:
stream:文件流指针 – 要操作的文件
返回值:
文件偏移指针当前位置到文件开头的距离
rewind();
函数原型:void rewind(FILE *stream);
函数功能:把文件偏移指针重新定位到文件开头。 == fseek(fp, 0, SEEK_SET);
形参列表:
stream:文件流指针 – 要操作的文件
返回值:无
fclose();
函数原型:int fclose(FILE *fp);
函数功能:关闭文件流指针
形参列表:
fp:文件流指针 – 要操作的文件
返回值:
成功:0
失败:-1