一、关于文件定位问题
1、重新定位文件指针流 --fseek
可以用手册查看使用 man 3 fseek
头文件
#include <stdio.h>
函数原型
int fseek(FILE *stream, long offset, int whence);
函数作用:
重置文件光标的位置
函数参数:
stream--->你要设置哪个文件的文件光标,将这个文件的文件指针传递进来
offset--->基于 基准点的偏移量
whence---> 参考位置
SEEK_SET 设置到文件开头
SEEK_CUR 设置到文件当前位置
SEEK_END 设置到文件尾部
返回值:
成功返回 0
失败返回 -1
注意:lseek和fseek的返回值不一样,fseek不能用返回值来得到文件的大小
2、获取当前偏移量距离开头的字节数。 man 3 ftell
头文件
#include <stdio.h>
函数原型
long ftell(FILE *stream);
函数作用:
获取当前偏移量距离开头的字节数
函数参数:
stream 文件指针
返回值:
成功返回 距离文件开头的字节数
失败返回 -1
3、重置文件指针。 man 3 rewind
作用:rewind函数把文件流的读写位置(光标位置)偏移到开头。
void rewind(FILE *stream);
函数参数:
stream 文件指针
相当于调用: fseek(fp,0,SEEK_SET);
4、feof
头文件
#include <stdio.h>
定义函数
int feof(FILE * stream);
函数作用
feof()用来侦测是否读取到了文件尾,
参数
stream 文件指针
返回值
如果当前文件流在文件尾(也就是读完了),返回 非零值
如果当前文件没有读完,返回 0
如果读一个空文件时,会把EOF当做读取成功,所以要用getch();之后再判断
5、ferror
头文件
#include <stdio.h>
定义函数
int ferror(FILE *stream);
函数作用
判断文件是否出错了
返回值
如果有错误发生 则返回非 0 值
没有错误 返回 0
二、fprintf输出函数
#include <stdio.h>
int fprintf(FILE *stream, const char *format, ...);
函数作用:
将指定的格式化字符串数据 输出到指定的文件stream中
例子1:
将指定的数据输出到标准输出设备(屏幕)
char *str = "hello";
fprintf(stdout,"%s",str);
例子2:
#include<stdio.h>
//要求:将一个人的信息保存(写入)到文本中
int main()
{
char *name = "gebi";
int age = 20;
char *sex = "man";
//1、打开文件
FILE* fp = fopen("./info.txt","wb+");
if(fp == NULL)
{
printf("fopen info.txt error\n");
return -1;
}
//将指定格式的数据 输出到指定的文件中
fprintf(fp,"name:%s age:%d sex:%s\n",name,age,sex);
fclose(fp);
return 0;
}
三、fscanf函数
#include <stdio.h>
int fscanf(FILE *stream, const char *format, ...);
函数作用:从指定的文件stream 获取 指定格式的数据
例子1:从键盘上获取指定格式的数据
fscanf(stdin,"%s %d %s",name,&age,sex);
例子2:
#include<stdio.h>
//要求:从一个文本中 按照 指定的格式 读取 数据
int main()
{
char name[256]={0};
int age;
char sex[20]={0};
//1、打开文件
FILE* fp = fopen("./info.txt","rb+");
if(fp == NULL)
{
printf("fopen info.txt error\n");
return -1;
}
//以指定的格式从文本fp中获取数据,存储到变量对应的内存空间上
fscanf(fp,"name:%s age:%d sex:%s",name,&age,sex);
printf("name:%s age:%d sex:%s\n",name,age,sex);
fclose(fp);
return 0;
}
注意:fprintf以什么格式写入到文本中,fscanf就要以什么格式获取数据
练习1:定义一个学生结构体,从键盘上获取5个同学的信息,保存到文本中。
练习2:从文本中 获取 到学生的信息,并且全部显示出来。
四、标准IO其他接口函数
标准IO特殊函数。
sprintf() getchar() getc() fgetc() putchar() putc() fputc() puts() gets() fgets()
1、sprintf() -> 保存一个字符串,拼接字符串。
头文件:#include <stdio.h>
函数原型: int sprintf(char *str, const char *format, ...);
参数:
str:数据缓冲区
format:字符串格式
返回值: 字符串总字符个数。
#include<stdio.h>
int main()
{
char *name = "何永成";
int age = 18;
char *sex = "男";
char *city = "广东湛江";
char buf[1024]={0};
//将上面三个数据 拼接在一起,保存到数组中
sprintf(buf,"我的名字是:%s 来自:%s 今年芳龄:%d 性别:%s",name,city,age,sex);
printf("%s\n",buf);
return 0;
}
2、getchar() -> 从标准输入缓冲区获取一个字符。 -> man 3 getchar (用于清空stdin缓冲区)
头文件:#include <stdio.h>
函数原型: int getchar(void);
参数:无
返回值:
成功: 获取到的字符
失败: EOF
#include <stdio.h>
int main(int argc,char *argv[])
{
int a;
char b;
scanf("%d",&a); -> 65 + 回车 -> 65就会放置到a变量中
//把缓冲区的数据清空掉。
//getchar(); //把\n吃掉
//while(getchar()!='\n');
scanf("%c",&b); -> 回车就会放置到b变量。
printf("a = %d\n",a);
printf("a = %c\n",a);
printf("b = %d\n",b);
printf("b = %c\n",b);
return 0;
}
3、getc() -> 从文件指针中获取一个字符 -> man 3 getc
头文件:#include <stdio.h>
函数原型: int getc(FILE *stream);
stream:需要获取字符的文件的文件指针。
返回值:
成功:获取到的字符
失败:EOF
getchar() -> 固定从标准输入中获取。
getc() -> 既可以从标准输入中获取,也可以从文件中获取。
3、 fgetc() -> -> 从文件指针中获取一个字符 -> man 3 fgetc
int fgetc(FILE *stream);
等价于 getc()
4、 putchar() -> man 3 putchar -> 将一个字符输出到屏幕终端上
原型:int putchar(int c);
参数:c: 需要输出的字符
返回值:
成功:输出的字符
失败:EOF
#include <stdio.h>
int main(int argc,char *argv[])
{
char a = 'x';
int b;
b = putchar(a);
printf("b = %d\n",b);
printf("b = %c\n",b);
return 0;
}
5、putc() -> man 3 putc -> 将一个字符搞到一个文件中
putc 等价于 fputc
原型:int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
参数: c: 需要处理的那个字符
stream: 文件指针
返回值:
成功:输出的字符
失败:EOF
练习6: 使用getc与putc完成文件拷贝。
6、puts() -> 将一个字符串输出到屏幕。 -> puts(s) 等价于 printf("%s\n",s);
int puts(const char *s); -> 只能是标准输出
s: 需要处理的字符串
返回值:
成功: 非负整数 字符个数+\n
失败: EOF
注意:puts输出 自带换行符 \n
7、 fputs() -> 将一个字符串输出到文件。
int fputs(const char *s, FILE *stream); -> 既可以是标准输出,也可以是一个文件
s: 需要处理的字符串
stream:文件指针
返回值:
成功: 非负整数 1
失败: EOF
比如:
#include<stdio.h>
int main()
{
//输出一个字符串到屏幕终端上
//fputs("hello world",stdout);
FILE *fp = fopen("./1.txt","wb");
if(fp == NULL)
{
printf("fopen error\n");
return -1;
}
//输出一个字符串到指定的文件中
fputs("hello world\n",fp);
fclose(fp);
return 0;
}
8、fgets() -> 从文件指针中获取一个字符串,包含'\n'。 -> man 3 fgets
原型:char *fgets(char *s, int size, FILE *stream);
参数:
s: 数据缓冲区
size: 获取的大小
stream: 文件指针
返回值:
成功: 返回s的值。
失败: NULL
注意:
函数说明 fgets()用来从参数 stream 所指的文件内读入字符并存到参数 s 所指的内存空间, 直到出现换行字符、
读到文件尾或是已读了 size-1 个字符为止, 最后会加上 NULL 作为字符串结束.
int main(int argc,char *argv[])
{
char buf[100] = {0};
fgets(buf,100,stdin);
printf("buf:%s",buf);
return 0;
}
9、gets-->从键盘上获取 字符串
char *gets(char *s);
参数: s-->获取的字符串存储到这里
注意: 建议不要使用此函数,因为很容易 会造成 缓冲区 溢出的安全问题。使用 fgets代替
总结:
1、经常使用的标准IO接口:
printf sprintf fprintf scanf fscanf getchar putchar
2、要学会瞎折腾,多动手,自然会熟记于心
无他,唯有手熟尔。