C语言中的文件操作

打开一个流式文件:

头文件:#include<stdlib.h>


FILE*  fa = fopen(const char *path,const char *mode);

fclose(fa);//用完要关闭文件。

如果成功返回file类型指针,如果错误返回NULL.

const char *path指文件名,const char *mode指使用文件方式(r【只读】,r+【读写】,a【写追加】,a+【读写追加】,w【写或建】,w+【写或建,可读】t【文本文件】,b【二进制文件】)

只有w和w+,a和a+有创建功能。

PS:文件指针有两个!一个是读指针,一个是写指针。如果用a+方式打开文件,注意读写指针的位置是不一样的!!!
例如 : FILE* fp=fopen("a.txt","w"); //若有a.txt则清除原内容,重新写入;若无则新建一个a.txt。

=============================================================

对一个流式文件的顺序读写:

单字节读写函数:fgetc 和 fputc。
字符串读写函数:fgets 和 fputs。
格式化读写函数:fscanf 和 fprintf 。
数据块读写函数:fread 和 fwrite。

头文件:#include<stdio.h> (在此头文件中,EOF为定值-1)

int fgetc(FILE* fp);

功能:读取文件指针fp目前所指文件位置中的字符,进行返回。读取完毕,文件指针自动往下一移一个字符位置,若文件指针已经到文件结尾,返回-1。


int fputc(char ch,FILE* fp);

功能:把字符ch写入文件指针fp所指向文件的位置,成功时返回字符的ASCII码,失败时返回EOF。

PS:只能一个一个字符循环写入,不可写入字符串。


char *fgets(char *str, int n, FILE* fp);

功能:在文件指针fp所指文件位置读取n个字符并放入str字符数组中。如果读不到字符串(到达文件结尾),则返回NULL。

PS:n为获取的元素个数,如果个数大于一行,则提取一行,小于一行则提取n-1个元素,后面自动补充'\0'!!!!!!


int fputs(char* str , FILE *fp);

功能:将字符串str写入文件指针fp所指文件的位置,写入数据成功时返会非0值,写入失败时返回EOF。


int fscanf(FILE* fp , “格式化字符串”,【输入项地址表】);

功能:从文件指针fp所指向的文件中按照格式字符串指定的格式将文件中的数据送到输入项地址表中。若读取数据成功会返回所读取数据的个数,并将数据按照指定格式存入内存中的变量或数组中,文件指针自动乡下移动;若读取失败则返回0。

例如: 文件中的数据为(学号,姓名,性别,中间以空格分开):190201 凌峰 男

char num[20],name[40],sex[5];
FILE* fp = fopen("e:\\code\\test.txt","rt");
fscanf(fp,"%s %s %s".num,name,sex);

将学号,姓名,性别分别赋值给字符数组num,name和sex。


int fprintf(FILE* fp , “格式化字符串”,【输出项地址表】);

功能:将输出项地址表中的变量值按照格式字符串指定的格式输出到文件指针fp所指向的文件位置。
PS:最好每次输入之间,写入一个回车进行换行。
char num[20] = “190525”,name[40] = “小明”,sex[5] = “女”;
FILE* fp = fopen("e:\\code\\test.txt","rt");
fputc('\n',fp);
fscanf(fp,"%s %s %s".num,name,sex);
test.txt里为:
190201 凌峰 男
190525 小明 女


int fread(void* buffer, int size, int count, FILE* fp);

功能:从文件指针fp所指向的文件的当前位置开始,一次读入size个字节,重复count次,并将读取到的数据存到buffer开始的内存区中,同时将读写位置指针后移size*count次。该函数的返回值为实际读取的count值。

int fwrite(void* buffer, int size, int count, FILE* fp);

功能:从buffer做纸箱的内存区开始,一次输入size个字节,重复count次,并将输出的数据存入到fp所指向的文件中,同事将读写位置指针后移size*count次。


==============================================================

#include<stdlib.h>

char* fgets(const void *ptr, size_t size, FILE *stream)

size为获取的元素个数,如果个数大于一行,则提取一行,小于一行则提取size-1个元素,后面自动补充'\0'。如果到达文件结尾,gets失败,则返回NULL。

============================================================

文件的随机读写:

void rewind(FILE* fp);

功能:将文件内部的位置指针移到文件的开始位置。

int fseek(FILE *fp, long offset, int whence);

功能:文件指针由whence位置向后移动offset个字节。调用成功返回0。失败返回-1。errno会存放错误代码。
其中:whence
包括 SEEK_SET(0)初始位置,SEEK_CUR(1)当前位置, or SEEK_END(2)结束位置,3种状态。
fseek(fp,-10L,0);   //
文件往前偏移不能超过其开头的初始位在,err

fseek(fp, 3L, 2);//文件可以在结尾向后偏移,返回值为EOF(-1)。


int ftell(FILE* fp);

功能:得到流式文件的当前位置,用相对于文件开头的位移量来表示。出错返回-1L。


===========================================================

查看错误信息:

在vim /usr/include/asm-generic/errno.h中查看error number文件内容。

例子:

FILE *fp=fopen("a.txt","r");
if(fp==NULL){
    perror("fopen:\n"); //输出“ ”里面的字,并给出错误信息。
    exit(EXIT_FAILURE);
}

=========================================================

正常退出运行程序

exit return 的区别:空间清理 exit,可以在程序结束时帮助关闭文件。
头文件: #include<stdlib.h>
void exit(int status);
exit(EXIT_FALURE);  --exit(1); 
错误退出
exit(EXIT_SUCCESS); --exit(0); 
正常退出

========================================================

文件IO操作:          

标准IO                            系统IO

标准库中的IO操作      针对于当前系统提供的IO操作
fopen fread fwrite       open read
 fgets fputs ...(f)

stdin     
标准输入流
stdout   
标准输出流
stderr   
标准错误流

例:int ch=fgetc(stdin) //在输入界面输入。


系统IO的标准输入输出

定义在/usr/inlcude/unistd.h
    STDIN_FILENO    0
    STDOUT_FILENO   1
    STDERR_FILENO   2

=============================================================

缓冲区问题:

标准输入库中基本上都带缓冲区
   
行缓冲:当前行满的时候,才刷新缓冲区的内容。
   
全缓冲:当缓冲区满的时候,才对缓冲区刷新一次。
   
不缓冲:不带缓冲区(系统IO

例:printf不足一行,没有\n结尾的情况下,如果程序不结束,将不会输出。
    int fflush(FILE *stream);   //
强制刷新缓冲区
    eg:fflush(stdout);


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值