C语言 常用文件IO函数

本文例子与部分解释来自: 菜鸟网 : https://www.runoob.com/

C语言文件类型指针:

FILE* 指针名;

打开文件:

FILE *fopen(char *filename, char *mode);

filename为文件名,mode为打开方式
fopen常用打开方式:

打开方式说明
r读(文本文件)
w写(文本文件)会新建一个文本文件,文件名存在则将被删除后创建。
a打开一个文件文件,不存在而新建,存在则在文件末尾追写(不可读)

修饰打开方式的修饰符(个人取名):


+ 表达可读可写:
例如:r+ 表示 读写(文本文件)


b 表示打开二进制文件:
例如:rb 表示读(二进制文件)


修饰符可以搭配使用,例如:
rb+ 读写二进制文件


文件指针结构体原型:

#ifndef _FILE_DEFINED
struct _iobuf {
    char *_ptr; //文件输入的下一个位置
    int _cnt; //当前缓冲区的相对位置
    char *_base; //指基础位置(即是文件的起始位置) 
    int _flag; //文件标志
    int _file; //文件描述符id
    int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取
    int _bufsiz; //文件缓冲区大小
    char *_tmpfname; //临时文件名
       };
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif

文本文件可以理解成windows下的txt文件,而二进制文件可以理解成视频、音乐等等文件。
关于文本文件与二进制文件的根本区别:https://blog.csdn.net/colourful_sky/article/details/80334250


向文件流写入数据:

把 ptr 所指向的数组中的数据写入到给定流 stream 中

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

ptr – 这是指向要被写入的元素数组的指针。
size – 这是要被写入的每个元素的大小,以字节为单位。
nmemb – 这是元素的个数,每个元素的大小为 size 字节。
stream – 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。

返回:写入数据的个数。

例:
#include<stdio.h>
 
int main ()
{
   FILE *fp;
   char str[] = "This is runoob.com";
 
   fp = fopen( "file.txt" , "w" );
   fwrite(str, sizeof(str) , 1, fp );
 
   fclose(fp);
  
   return(0);
}

注意:文件的输入会在文件指针关闭时才会从缓冲区输入!!!
所以,你在调用fwrite函数的时候,要fclose才会生效!


清空文件缓冲区:

int fflush(FILE *stream)

刷新stream流的缓冲区数据,有效数据清零,指针回到起点。

成功返回0,错误返回EOF


从文件流读取字符串:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

ptr – 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
size – 这是要读取的每个元素的大小,以字节为单位。
nmemb – 这是元素的个数,每个元素的大小为 size 字节。
stream – 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。
返回读取成功的元素个数

例:

#include <stdio.h>
#include <string.h>
 
int main()
{
   FILE *fp;
   char c[] = "This is runoob";
   char buffer[20];
 
   /* 打开文件用于读写 */
   fp = fopen("file.txt", "w+");
 
   /* 写入数据到文件 */
   fwrite(c, strlen(c) + 1, 1, fp);
 
   /* 查找文件的开头 */
   fseek(fp, 0, SEEK_SET);
 
   /* 读取并显示数据 */
   fread(buffer, strlen(c)+1, 1, fp);
   printf("%s\n", buffer);
   fclose(fp);
   
   return(0);
}

从流 stream 格式化读取到字符串:

int fscanf(FILE *stream, const char *format,char *str,...);

从stream中以format的格式来读取到str
format的格式与scanf的格式一样。
例:

#include <stdio.h>
#include <stdlib.h>


int main()
{
   char str1[10], str2[10], str3[10];
   int year;
   FILE * fp;

   fp = fopen ("file.txt", "w+");
   fputs("We are in 2014", fp);
   
   rewind(fp);
   fscanf(fp, "%s %s %s %d", str1, str2, str3, &year);
   
   printf("Read String1 |%s|\n", str1 );
   printf("Read String2 |%s|\n", str2 );
   printf("Read String3 |%s|\n", str3 );
   printf("Read Integer |%d|\n", year );

   fclose(fp);
   
   return(0);
}

字符串格式化输出到流 stream 中(与scanf相反):

int fprintf(FILE *stream, const char *format,char *str,...);

将str的字符串以format的格式输出到stream流中
format的格式与printf的格式一样。

#include <stdio.h>
#include <stdlib.h>

int main()
{
   FILE * fp;

   fp = fopen ("file.txt", "w+");
   fprintf(fp, "%s %s %s %d", "We", "are", "in", 2014);
   
   fclose(fp);
   
   return(0);
}

文件指针回到开头,清除文件流:

void rewind(FILE *stream);

stream表示要操作的文件流。


把字符串写入到指定的流 stream 中,但不包括空字符:

int fputs(const char *str, FILE *stream)

str 是一个字符串
stream 是要写入的文件流
注意:该函数会以空字符为终止。
返回值:该函数返回一个非负值,如果发生错误则返回 EOF。


把一个字符写入到指定的流stream中:

int fputc(int char, FILE *stream)

把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。


读取一行字符串并写入到stream中:

char *fgets(char *str, int n, FILE *stream) 

从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。


从stream流中读取一个字符:

int fgetc(FILE *stream)

从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。


判断文件指针是否到了结尾,是返回0,不是返回非0:

int feof(FILE *stream)

测试给定流 stream 的错误标识符:

int ferror(FILE *stream)

如果设置了与流关联的错误标识符,该函数返回一个非零值,否则返回一个零值。


清除给定流 stream 的文件结束和错误标识符:

void clearerr(FILE *stream)

这不会失败,且不会设置外部变量 errno,但是如果它检测到它的参数不是一个有效的流,则返回 -1,并设置 errno 为 EBADF。


设置文件指针的位置:

int fseek(FILE *stream, long int offset, int whence)

stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
offset – 这是相对 whence 的偏移量,以字节为单位。
whence – 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:

常量描述
SEEK_SET文件的开头
SEEK_CUR文件指针的当前位置
SEEK_END文件的末尾

返回值:如果成功,则该函数返回零,否则返回非零值。


查找当前文件指针距文件夹有多少字节:

long int ftell(FILE *stream)

返回值:该函数返回位置标识符的当前值。如果发生错误,则返回 -1L,全局变量 errno 被设置为一个正值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值