标准C库文件操作API以及DEMO

相关API

FILE *fopen(const char *path, const char *mode);
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
int fseek(FILE *stream, long offset, int whence);
int fclose(FILE *fp);
int fputc(int c, FILE *stream);
int fputs(const char *s, FILE *stream);
int feof(FILE *stream);
int fgetc(FILE *stream);
char *fgets(char *s, int size, FILE *stream);
  • FILE *file; //定义FILE结构体指针变量,这个指针指向的FILE结构体的内存空间是系统自动分配的.
    file = fopen(“文件路径”,“文件打开方式”); 打开使用完过后记得关闭fclose(文件指针);
    返回值 : 执行成功返回FILE结构体指针,出错返回NULL.
    注意:一般是不会同时进行写入和读取

  • 对于fread和fwrite的返回值容易产生误解,看到返回值为size_t时人们很有可能理解为fread和fwrite会返回成功读取的或写入的字节数,然而实际上其返回的是成功读取或写入的个数,即有多少个size大小的对象被成功读取或写入了

  • 示例代码

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

int main(void)
{
	const char str[]="123456789";
	FILE *fp = fopen("tmp.txt","w");
	size_t size fwrite(str,strlen(str),1,fp);

	printf("size is %d\n",size);
	return 0;
}
  • 这段代码输出size为1,结果并不是写入的字符串长度9,而是返回写入的对象个数1,其原因是参数ptr指示的是要写入对象的地址,size为每个对象的字节数,nmemb为多少个要写入的对象,将上面fwrite代码变换为以下写法
size_t size fwrite(str,1,strlen(str),fp);
  • 这时程序的输出就变为size is 9 原因在于参数size表示每个对象的字节数是1字节,nmemb表示要写入9个对象,因此返回值就变为9
打开方式描述
“r”以只读方式打开文件,文件必须存在.
“r+”以可读写的方式打开文件,文件必须存在.
“w”以只写方式打开文件,文件不存在则创建;文件存在则擦除文件中的内容.
“a”以只写方式打开文件,文件不存在则创建;文件存在则新内容从文件内容末尾开始写入.
“w+”以可读写的方式打开文件,文件不存在则创建;文件存在则擦除文件中的内容.
“a+”以可读写方式打开文件,文件不存在则创建,文件存在则新内容从文件内容末尾开始写入.
  • fputc(‘字符’,文件指针);向文件中输入一个字符
    char c=‘Y’; fputc(c,file);
  • fgetc(文件指针);从文件中获取一个字符
    fgetc(file);这个函数有一个返回值,可以用变量去接受,也可以直接输出
  • fputs(“字符串”,文件指针);向文件中输入一串字符
    char s[100]=“asdf”;fputc(s,file);
  • fgets(字符数组,要读取字符的大小,文件指针);获取一个字符串
    char s[100]; fgets(s,100,file);这样就把文件里面的字符串赋值给了字符数组s

文件操作DEMO


#include "stdio.h"
#include "string.h"
#include "stdlib.h"

char *str="xiaoma want to become NB";

int len=strlen(str);

fwrite(str,len,1,fd);

fseek(fd,0,SEEK_SET);


char *readstr;
readstr=(char *)malloc(len+1);
memset(readstr,'\0',len+1);


fread(readstr,len,1,fd);

printf("reeadstr=%s\n",readstr);
fclose(fd);
return 0;
}

reeadstr=xiaoma want to become NB

文件的输入DEMO

#include "stdio.h"
#include "string.h"
//       FILE *fopen(const char *path, const char *mode);

int main()
{

        FILE *fd;
        fd=fopen("test1.txt","w+");

        char *str="xiaoma become NB";

        int len=strlen(str);
        int i;
//      for(i=0;i<len;i++)  //其中一种方法
//      {
//              fputc(*str,fd);
//              str++;
//      }
        fputs(str,fd);    //第二种方法
        fclose(fd);
        return 0;
}

CLC@Embed_Learn:~/review$ cat test1.txt 
xiaoma become NB
CLC@Embed_Learn:~/review$ 

文件的输出DEMO

#include "stdio.h"
#include <stdlib.h>
int main(void)
{
    FILE *fp=NULL;
    char c;
    fp=fopen("test1.txt","r");
    if(fp == NULL)
    {
        printf("不能够访问该文件.\n");
        exit(1);
    }
    while(!feof(fp))
    {
        c = fgetc(fp);
        printf("%c:\t%x\n",c,c);
    }
    fclose(fp);
    fp=NULL;
}

结果:
x:	78
i:	69
a:	61
o:	6f
m:	6d
a:	6120
b:	62
e:	65
c:	63
o:	6f
m:	6d
e:	6520
N:	4e
B:	42
�:	ffffffff

  • int feof(FILE *fp);值得注意的是,函数 feof 只用于检测流文件,当文件内部位置指针指向文件结束时,并未立即置位 FILE 结构中的文件结束标记,只有再执行一次读文件操作,才会置位结束标志,此后调用 feof 才会返回为真。
  • 会发现最终输出结果会多输出一个结束字符EOF(这里的 EOF 是 fgetc 函数的返回值,并不是文件中存在的 EOF)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值