文件操作

首先我们使用c语言创建一个文件

int main(void)
{   
    FILE *fp;
    fp = fopen("test.c","w"); 


    fclose(fp);
 
    return 0;
}

 


 

fopen

FILE *fopen(const char *pathname, const char *mode);
pathname  是你要打开的文件的名字,比如上面例子中的"test.c"
mode    是你要打开的模式,有以下几种可以选择:c语言文件打开模式

所以我们使用w打开一个原本不存在的文件,那么就会新建一个名为test.c的文件

 

fclose

int fclose(FILE *stream);
stream  参数就填文件描述符

所有打开的文件在程序结束之前都必须要关闭。

 

 

还有一个比较霸道的函数

fcloseall

int fcloseall(void);

直接关闭所有打开的文件。


 

 

那接下来我想在新建的这个文件里写点东西,可以这样

int main(void)
{   
    FILE *fp;
    fp = fopen("test.c","w"); 
    fprintf(fp,"%s\n","hello everyone");

    fclose(fp);
 
    return 0;
}

在查看test.c的内容时,就能看到已经写进去了hello everyone

当然也可以这样做

int main(void)
{   
    FILE *fp;
    fp = fopen("test.c","w"); 
    fputs("hello everyone 123\n",fp);

    fclose(fp);
 
    return 0;
}

也同样可以写进去hello everyone 123

 

 

fprintf

int fprintf(FILE *stream, const char *format, ...);
stream  文件描述符
      后面的参数用法和printf一样

 

 

fputs

int fputs(const char *s, FILE *stream);
s    你要写入的内容(字符串)
stream  文件描述符

 

同样还有写入单个字符的函数

fputc

int putc(int c, FILE *stream);

 

那么如果我想直接在代码中读取文件内容呢?

int main(void)
{   
    char tmp[100];
    FILE *fp;
    fp = fopen("test.c","rw"); 
    fputs("hello everyone 123\n",fp);

    fscanf(fp,"%s",tmp);
    printf("%s\n",tmp);

    fclose(fp);
 
    return 0;
}

也可以这样

int main(void)
{   
    char tmp[100];
    FILE *fp;
    fp = fopen("test.c","rw"); 
    fputs("hello everyone 123",fp);

    fgets(tmp,20,fp);
//  fscanf(fp,"%s",tmp);
    printf("%s\n",tmp);

    fclose(fp);
 
    return 0;
}

这里我打开方式变成了 rw 因为现在我要从文件中读取数据 所以只有w是读不出来的

 

 

fscanf

int fscanf(FILE *stream, const char *format, ...);
stream  文件描述符
      其他参数和scanf用法相同

和 scanf 不同的是,scanf 是从键盘输入,要想 fscanf 也从键盘输入,则第一个参数可以写 stdin

要想用 fprintf 实现 printf 的效果,则第一个参数为 stdout

 

fgets

char *fgets(char *s, int size, FILE *stream);
s    读出数据存放的位置
size  读多少个数据
stream 文件描述符

 

fgetc

int fgetc(FILE *stream);

fgetc每读取一个字符后,将光标向后移动一位,可以继续读取下一个字符,若读取失败(最后一位) 返回值为EOF

 

 

fread

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr      读取的数据存放地址
size      每次读多少字节
nmemb     读多少次
stream    文件描述符

 

fwrite

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
ptr    要写入的数据存放的地址
其他参数和fread相同

 

使用fread读数据:

#include <stdio.h>
#include <string.h>
 
int main(void)
{   
    int a;
    char tmp[100];
    FILE *fp;
    fp = fopen("test.c","r+"); 


    fread(tmp,5,1,fp);
    puts(tmp);

    memset(tmp,0,100);
    a = fread(tmp,1,8,fp);
    puts(tmp);
    printf("%d\n",a);
    
    fclose(fp);
 
    return 0;
}

输出结果

hello
everyone
8

第一次1次性读了5个字节,读一次,所以输出hello

第二次分成8次,每次读1个字节,输出everyone

返回值为实际读取的元素的个数

 

#include <stdio.h>
#include <string.h>
 
int main(void)
{   
    int a;
    char tmp[100];
    char *tmp2 = "hello china";
    FILE *fp;
    fp = fopen("test.c","r+"); 


    fread(tmp,5,1,fp);
    puts(tmp);

    memset(tmp,0,100);
    a = fread(tmp,1,8,fp);
    puts(tmp);
    printf("%d\n",a);

    fwrite(tmp2,1,8,fp);


    fclose(fp);
 
    return 0;
}

输出结果为

helloeveryonehello ch

写入8次,每次1个字节,没有问题

但是覆盖了原来的helloeveryone123

这和我们的打开方式无关

只要是用fwrite 如果在数据中间写,那就必然会覆盖后面的内容

 

posted @ 2020-03-24 16:16  祁峰_1024  阅读(154)  评论(0编辑  收藏  举报