此文章为个人学习笔记,有些知识点可能解释得不是那么正确,所以有人参考文章的时候,可以借鉴其他的文章一起来学习!
fopen和open的区别
转载连接1:http://blog.chinaunix.net/uid-29025972-id-3847404.html
转载连接2:https://www.cnblogs.com/nickyye/p/5497659.html
fopen的参数含义
转载连接:https://www.cnblogs.com/hnrainll/archive/2011/09/16/2178706.html
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);//一般用这个
其中
FILE 返回一个文件流 eg:FILE *fp
const char *path 为打开文件的路径
const char *mode 为打开文件的权限
FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *stream);
int fseek(FILE *stream, long offset, int whence);//跟lseek用法基本一致
long ftell(FILE *stream);
void rewind(FILE *stream);
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, fpos_t *pos);
其中 mode 打开模式:???????????????????????????????????????????? ??????? r?? 只读方式打开一个文本文件??????????????????????????? ??????? rb? 只读方式打开一个二进制文件????????????????????????? ??????? w?? 只写方式打开一个文本文件??????????????????????????? ??????? wb? 只写方式打开一个二进制文件????????????????????????? ??????? a?? 追加方式打开一个文本文件??????????????????????????? ??????? ab? 追加方式打开一个二进制文件????????????????????????? ??????? r+? 可读可写方式打开一个文本文件??????????????????????? ??????? rb+ 可读可写方式打开一个二进制文件????????????????????? ??????? w+? 可读可写方式创建一个文本文件??????????????????????? ??????? wb+ 可读可写方式生成一个二进制文件????????????????????? ??????? a+? 可读可写追加方式打开一个文本文件??????????????????? ??????? ab+ 可读可写方式追加一个二进制
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t 返回一个正整数,且为size_t nmemb值
void *ptr 将数据读到该缓冲区里面去
size_t size 数据类型的大小
size_t nmemb 有多少个该数据类型
(无论这两种怎么读写,反正最后size_t size * size_t nmemb = 数据大小 size_t )
FILE *stream 文件流(从哪一个文件读)
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t 返回一个正整数,且为size_t nmemb值
const void *ptr 为缓冲区;需要写的数据
size_t size 数据类型的大小
size_t nmemb 有多少个该数据类型
(无论这两种怎么写,反正最后size_t size * size_t nmemb = 数据大小 )
(可理解为一次读size_t size 这么大,一共读 size_t nmemb 这么多次)
FILE *stream 文件流(写进哪一个文件)
上代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
FILE *fp;
char *str="hello word ! I LOVE China !";
fp=fopen("./test14.txt","w+");
int n_write;
n_write=fwrite(str,sizeof(char),strlen(str),fp);
printf("n_write=%d !\n",n_write);
//frwite(str,sizeof(char)*strlen(str),1,fp);
fseek(fp,0,SEEK_SET);
char *readbuf=NULL;
readbuf=(char *)malloc(sizeof(str));
int n_read;
n_read=fread(readbuf, sizeof(char),strlen(str),fp);
printf("n_read = %d !\n",n_read);
printf("readbuf test : %s\n",readbuf);
fclose(fp);//记住一定要关闭文件
return 0;
}
运行结果

在上面的代码有一个fwrite和fread的一个返回值问题
size_t 返回一个正整数,为size_t nmemb值
原来的写法 int n_fwrite=fwrite(str,sizeof(char),strlen(str),fp);2
修改后的写法 int n_fwrite=fwrite(str,sizeof(char)*strlen(str),1,fp); //将这里的size_t size改成该数据内容的大小, size_t nmemb改成1,那么返回追n_fwrite的值则是size_t nmemb的值1
对比代码
(这种可用于一些结构体,联合体等中,这样计算大小就不会出现一些计算规则的细节问题)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
//FILE *fopen(const char *path, const char *mode);
FILE *fp;
char *str="hello word ! I LOVE China !";
fp=fopen("./test14.txt","w+");
int n_fwrite=fwrite(str,sizeof(char)*strlen(str),1,fp);
//将这里的size_t size改成该数据内容的大小, size_t nmemb改成1,那么返回追n_fwrite的值则是size_t nmemb的值1
printf("n_fwrite=%d\n",n_fwrite);
//frwite(str,sizeof(char)*strlen(str),1,fp);
fseek(fp,0,SEEK_SET);
char *readbuf=NULL;
readbuf=(char *)malloc(sizeof(str));
//size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
int n_fread=fread(readbuf, sizeof(char),strlen(str),fp);
printf("n_fread=%d\n",n_fread);
printf("readbuf test : %s\n",readbuf);
fclose(fp);//记住一定要关闭文件
return 0;
}
运行结果

int fgetc(FILE *stream);
是从FILE *stream这个文件里面一个字符一个字符的读取
int fputc(int c, FILE *stream); 是从int c (只含有一个字符)里面一个字符的输出到FILE *stream文件里面去里面去;这个int c 也应该用指针的形式,即fputc(*str,fp),这样在读取字符串的时候比较好用。
int feof(FILE *stream);? ?判断是否达到文件尾部去
如果到达尾部则返回非0,否则返回0。多用在单个字符逐个逐个的读取的方式
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
char c = 'a';
fp=fopen("./test16d3.txt","w+");
//fputc('a',fp);//将a这个在字符输出到fp的文件里面去,即test16d3.txt。
fputc(c,fp);//将c字符的内容输出到fp的文件里面去,即test16d3.txt。
fclose(fp);
return 0;
}
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
int i;
char *str="hello China !";
int len=strlen(str);
fp=fopen("./test16.txt","w+");
for(i=0;i<len;i++)
{
fputc(*str,fp);
//将每一次循环时,对应的指针取内容(字符)输出到fp的文件里面去,即test16.txt。
str++;
}
fclose(fp);
return 0;
}
char *fgets(char *s, int size, FILE *stream);
- char *s?-- 这是指向一个字符数组的指针,该数组存储读取的字符串。即FILE *stream文件里面内容读到char *s这里面去。
- int size-- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。用strlen计算。
- FILE *stream?-- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。
#include <stdio.h>
int main()
{
FILE *fp;
char str[60];
/* 打开用于读取的文件 */
fp = fopen("./test16d2.txt","r");//如果只是读取文件,最好用只读权限
if(fp == NULL)
{
perror("fopen test16d2.txt error!");
return(-1);
}
if(fgets(str,60,fp)!=NULL )
{
puts(str);//这里就是打印刚刚读取出来的数据
}
fclose(fp);
return(0);
}
int fputs(const char *s, FILE *stream);
将const char *s 指针内的字符串输出到FILE *stream的文件里面去
#include <stdio.h>
int main()
{
FILE *fp;
//char str[60]={"this is fputs str !"};
char *str="this is fputs frome *str !";
fp = fopen("./test16d4.txt","w+");
//这个是将str数据读到该文件里面去,即该文件为可读可写权限
fputs(str,fp);
fclose(fp);
return(0);
}
|