标准IO:C语言库函数IO(文件)
库函数进行IO(输入输出、或读写操作)说明<stdio.h>
提供通用接口
库函数:
1、打开文件fopen函数
#include <stdio.h> //打开一个对应字符串表示名字的文件(对应文件名的文件) FILE *fopen(const char *pathname, const char *mode); //参数: // 参数1: //const char *pathname:字符串的首地址、要打开的文件名 // 参数2: //const char *mode:字符串首地址、用参数表示打开方式、存储打开的方式 //打开文件的方式 // r(read):读 w(write):写 a(append):追加 t(text):文本 b(binary):二进制文件(如果没有添加默认为t表示文本方式打开) // +:扩展权限 // 打开权限由上述字符构成、也就是可以使用多种权限 // r:只读,打开文件的开始位置,文件必须存在 // w:只写,如果文件存在则清空文件,不存在则创建文件 // a:追加,在文件末尾添加内容,不存在则创建文件 // r+:读写,文件必须存在 // w+:读写,文件存在则清空、不存在则创建文件 // a+:读写,文件末尾追加、不存在则创建文件 //读写中,缺少哪个权限就+上对应权限 /* 文件信息结构体FILE 打开文件函数调用时内核会申请一段空间,存放文件的相关信息内容,这些内容都会被保存到一个结构体变量中,该结构体类型有系统进行声明定义,就是FILE 用FILE *来描述,FILE *叫做文件流指针 流: 所有的IO操作都是简单的移动,从程序移出或移进 */ //返回值: //FILE * 返回文件信息结构体的地址,要操作的文件是哪一个 //成功返回文件流指针 //失败返回NULL,同时自动设置错误码 例子:
#include <stdio.h>
#include <errno.h>
int main()
{
FILE *fp = fopen("1.txt","r+");
if(fp==NULL)
{
perror("fopen error");
}
}
2、打印错误码
//打印错误码 #include <stdio.h> #include <errno.h> //打印当前的错误码 void perror(const char *s); //参数:const char *s打印错误提示信息的字符串调用perror函数就输出s的内容
3、关闭文件
#include <stdio.h> //关闭指定文件 int fclose(FILE *stream); //参数:FILE *stream 文件流指针,关闭对应的文件 //返回值 int //返回0则是success,返回EOF则失败且设置错误码 //EOF相当于 #define EOF -1 例子
#include <stdio.h>
#include <errno.h>
int main()
{
FILE *fp = fopen("1.txt","r+");
if(fp==NULL)
{
perror("fopen error");
return -1;
}
if(fclose(fp))
{
perror("flcose error");
return -1;
}
return 0;
}
4、输入输出(读写文件内容)
1、fprintf——输出到文件(写文件)格式化写
#include <stdio.h> int printf(const char *format, ...); int fprintf(FILE *stream, const char *format, ...);//把format字符串输出到指定文件中 /* 参数 参数1 FILE *stream:文件流指针,输出到对应的文件 参数2 const char *format:输出的字符串,字符串中包含可替换字符(%s%d%f)例如 fprintf(fp,“%d%s%f”,10,"dsaha",1.2); 返回值 int 成功返回输出的字符个数 失败返错误值就是负数 */ 例子:
#include <stdio.h>
#include <errno.h>
int main()
{
FILE *fp = fopen("1.txt","w+");
if(fp==NULL)
{
perror("fopen error");
return -1;
}
int num = fprintf(fp,"%s","hello world");
printf("%d\n",num);
num = fprintf(fp,"a = %d,b = %f,c = %c\n",10,1.2,'a');
printf("%d\n",num);
if(fclose(fp))
{
perror("flcose error");
return -1;
}
return 0;
}
2、fscanf——从外部输入到程序(读文件)格式化读
#include <stdio.h> //读取文件内容,与format数据匹配 int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); /* 返回值 int 成功 返回匹配字符的个数 失败 EOF */
例子
#include <stdio.h>
int main()
{
//以只读打开2.txt
FILE *fp = fopen("2.txt","r");
if(fp==NULL)
{
perror("fopen error");
return -1;
}
//读取2.txt的第一个整数给a;
int a;
fscanf(fp,"%d",&a);
printf("%d\n",a);
//多次读取是从上一次读取结束的位置开始匹配
fscanf(fp,"%d",&a);
printf("%d\n",a);
//关闭访问的文件
if(fclose(fp))
{
perror("flcose error");
return -1;
}
return 0;
}
3、单个字符读写
#include <stdio.h> //从文件中读取一个字符,输入到程序中 int fgetc(FILE *stream); /* 参数 FILE *stream 文件流指针,从指定文件读取一个字符 返回值 int 成功 把读取到的字符以返回值的形式输入到程序中,并且转换成int类型 失败 EOF */
#include <stdio.h>
int main()
{
FILE *fp=fopen("1.txt","r+");
char buf[11];
for(int i=0;i<10;i++)
{
int c=fgetc(fp);
if(c==EOF)
{
if(feof(fp)!=0)
{
printf("is end of file\n");
return 0;
}
else
{
printf("get error\n");
return -1;
}
}
buf[i]=c;
}
}
int feof(FILE *stream); /*测试是否到末尾,如果返回非0,就是到文件末尾*/ int ferror(FILE *stream);
#include <stdio.h> //从程序中读取一个字符写入文件 int fputc(int c, FILE *stream); /* 参数 int c 整数,对应ASCII码的字符,要写入的字符 FILE *stream 对应的文件 返回值 int 成功 返回写入的字符的ASCII码即参数c 失败 返回EOF */
#include <stdio.h>
int main()
{
FILE *fp1 = fopen("1.txt","r");
FILE *fp2 = fopen("test.txt","w");
int c;
while(1)
{
c = fgetc(fp1);
if(c==EOF)
{
if(feof(fp1)!=0)
{
printf("copy flie ok!\n");
break;
}
return -1;
}
fputc(c,fp2);
}
fclose(fp1);
fclose(fp2);
}
4、多个字符读写
//一次读取多个字符,一次最大读取size-1个字符 /* Fgets()从流中最多读取一个小于size的字符并存储 读入由s指向的缓冲区。读入在EOF或换行符之后停止。 如果读取换行符,则将其存储到缓冲区中。终止的空字节 ('\0')存储在缓冲区的最后一个字符之后。 */ char *fgets(char *s, int size, FILE *stream) /* 参数 char *s 字符指针,读取内容存放的地址,需要有对应的存储空间,字符数组首地址 int size 读取的大小,最大读取size-1,有中止 FILE *stream 读取的文件名 使用feof/ferror判断 */
#include <stdio.h>
//fgets使用
int main()
{
FILE *fp=fopen("1.txt","r");
char buf[20];
fgets(buf,20,fp);
printf("%s",buf);
fclose(fp);
}
#include <stdio.h> //将程序内容输入到文件 //Fputs()将字符串s写入流,不包含终止的空字节('\0')。 int fputs(const char *s, FILE *stream); /* 参数 const char *s 字符指针,字符串首地址,要写入到文件的字符串首地址 FILE *stream 操作对应的文件 返回值 int 成功 返回正数 失败 返回EOF */
#include <stdio.h>
//fputs使用
int main()
{
FILE *fp2=fopen("2.txt","w");
if(fputs("hello world",fp2)==EOF)
{
printf("error\n");
}
char buf1[]="hello\0 world";
fputs(buf1,fp2);
fclose(fp);
}
5、指定大小输入输出
#include <stdio.h> //读取指定大小的文件内容,插入到程序中,大小就是数据个数乘字节大小 /* 函数fread()从对象中读取nmemb数据项,每个数据项的大小为字节 流指向的流,将它们存储在ptr指定的位置。 函数fwrite()将nmemb数据项(每个长度为字节)写入到 流指向的流,从ptr给出的位置获取它们。 */ size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); /* 参数 void *ptr 读取数据存储的位置 size_t size 每个数据的大小 size_t nmemb 读取数据的个数 FILE *stream 操作的文件 返回值 int 成功 返回读取的数据个数(返回值不一定要与读取数据的个数相同) 这次没有读取到数据,就表示上一次已经读到文件末尾,返回0 */ //写入指定大小的程序内容到文件,从程序输出数据到文件,大小就是数据个数乘字节大小 size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream); /* 参数 const void *ptr 存储数据的首地址 size_t size 每个数据大小 size_t nmemb 数据个数 FILE *stream 操作的文件 返回值 成功 返回写了多少数据 */
#include <stdio.h>
//fread使用
int main()
{
FILE *fp=fopen("1.c","r");
char buf[20];
fread(buf,1,20,fp);
printf("%s",buf);
}
#include <stdio.h>
//fwrite使用
int main()
{
FILE *fp=fopen("test.txt","w");
/* char buf[20]={0};
scanf("%s",buf);*/
int data[5]={1,2,3,4,5};
fwrite(data,4,5,fp);
}
#include <stdio.h>
int main()
{
FILE *fp=fopen("test.txt","r");
int data[5];
int a = fread(data,4,5,fp);
printf("%d\n",a);
for(int i=0;i<5;i++)
{
printf("%d ",data[i]);
}
printf("\n");
}