相关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: 61
: 20
b: 62
e: 65
c: 63
o: 6f
m: 6d
e: 65
: 20
N: 4e
B: 42
�: ffffffff
- int feof(FILE *fp);值得注意的是,函数 feof 只用于检测流文件,当文件内部位置指针指向文件结束时,并未立即置位 FILE 结构中的文件结束标记,只有再执行一次读文件操作,才会置位结束标志,此后调用 feof 才会返回为真。
- 会发现最终输出结果会多输出一个结束字符EOF(这里的 EOF 是 fgetc 函数的返回值,并不是文件中存在的 EOF)