首页 软件代码

C语言文件操作


没错,这还是为了应付计算机二级的文件操作选择题方面,在程序题中好像也曾出现过。我做了简单的复习,希望到时候能通过。

正文开始:

文件的打开与关闭

在打开文件之前我们需要先创建一个文件指针FILE *fp;,用来记录地址。

文件打开函数为fopen(文件名,使用文件方式),例如fopen("D:\\t.txt","w+")
文件名:是一串字符串,文件在你的电脑中储存的位置路径例如:D:\t.txt,因为\符号是转义符号,因此我们写的路径时要写成D:\\t.txt,当然也可以写成D:/t.txt
使用文件方式:

r:以只读方式打开文件,该文件必须存在。
r+:以读写方式打开文件,该文件必须存在。
rb+:以读写方式打开一个二进制文件,只允许读写数据。
rt+:以读写方式打开一个文本文件,允许读和写。
w:打开只写文件,若文件存在则文件长度清为零,即该文件内容会消失:若文件不存在则创建该文件。
w+:打开可读(写文件,若文件存在则文件长度清为零,即该文件内容会消失:若文件不存在则创建该文件。
a:以附加的方式打开只写文件。若文件不存在,则会创建该文件:如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF 符保留)。
a+:以附加方式打开可读写的文件。若文件不存在,则会创建该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(EOF符不保留)。
wb:以只写方式打开或新建一一个二进制文件,只允许写数据。
wb+:以读/写方式打开或新建一个二进制文件,允许读和写。
wt+:以读写方式打开或新建一个文本文件,允许读和写。
at+:以读写方式打开-个文本文件,允许读或在文本末追加数据。
ab+:以读写方式打开- -个二进制文件,允许读或在文件末追加数据。

文件关闭函数fclose(fp),其中fp为文件指针。

文件读写操作

(摘自:点击直达
fgetc 从文件中读取一个字符
格式为:fgetc(fp) fp为文件指针,每次读取后自动向后挪动。成功返回字符,失败返回EOF

fputc 写一个字符到文件中去
格式为:fputc(c,fp) c是个字符变量或字符,fp为文件指针。

fgets 从文件中读取一个字符串
格式为:fgets(s,n,fp) s为字符串指针(数组名),n为最大读取多少字符,fp为文件指针。
原型为char *fgets(char *str, int n, FILE *stream)

fputs 写一个字符串到文件中去。
格式为:fputs(s,fp) s为字符串指针(数组名),fp为文件指针。
int fputs(const char *str, FILE *stream)

fprintf 往文件中写格式化数据
涉及到格式控制点击到介绍页面:点击直达
fscanf 格式化读取文件中数据
涉及到格式控制点击到介绍页面:点击直达
如果fprintf和fscanf进行搭配时,如果不想以空格或换行为分割点,例如采用:,为分隔符,那么可以采用%[^,],的形式来读取。
具体方法可以访问:点击访问

fread 以二进制形式读取文件中的数据
格式为:fread(s,n,m,fp) s为字符串指针(数组名),n为一次读取多少字符,m为读取多少次,fp为文件指针。
原型为:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

fwrite 以二进制形式写数据到文件中去
格式为:fwrite(s,n,m,fp) s为字符串指针(数组名),n为一次写入多少字符,m为写入多少次,fp为文件指针。
原型为:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
(所有形式在百度或谷歌一搜就出现具体格式,推荐菜鸟教程)

文件检查和定位

文件状态检查函数
feof文件是否结束(结束返回非0,没结束返回0)

ferror 检查文件读/写出错

clearerr 清除文件错误标志

ftell 了解文件指针的当前位置(函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数)

文件定位函数 rewind 反绕(让文件指针回到文件开始地址)
fseek 随机定位,具体解释如

int fseek( FILE *stream, long offset, int origin );
第一个参数stream为文件指针
第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2.
简言之:
fseek(fp,100L,0);把stream指针移动到离文件开头100字节处;
fseek(fp,100L,1);把stream指针移动到离文件当前位置100字节处;
fseek(fp,-100L,2);把stream指针退回到离文件结尾100字节处。

代码实例

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

void fputc_fgetc()
{
    FILE *fp;
    int i;
    char c;
    printf("我是fputc_fgetc函数\n");
    if((fp=fopen("fputc_fgetc.txt", "w+"))==NULL)
    {
        printf("fputc_fgetc函数失败了");
        exit(1);
    }
    while((c=getchar())!='#')
        fputc(c,fp);
    fputc('\0',fp);
    rewind(fp);//让指针回到开头
    while((c=fgetc(fp))!='\0')
        printf("%c",c);
    fclose(fp);
    printf("\nfputc_fgetc函数结束了\n");
}
void fputs_fgets()
{
    while (getchar() != '\n');//清空缓冲区
    char c[100]={'\0'},s[100]={'\0'};
    FILE *fp;
    int i,j;
    printf("我是fputs_fgets函数\n\n");
    if((fp=fopen("fputs_fgets.txt", "w+"))==NULL)
    {
        printf("fputs_fgets失败了");
        exit(1);
    }
    for(i=0;(c[i]=getchar())!='#';i++);
    c[i]='\0';
    fputs(c,fp);//将c所指的字符串传递给fp文件指针
    rewind(fp);//让指针回到开头
    fgets(s,100,fp);//将fp文件指针所指的字符串读出100位赋值给s指针
            printf("%s",s);
    fclose(fp);
    printf("\nfputs_fgets函数结束了\n\n");
}
void fread_fwrite()
{
    while (getchar() != '\n');//清空缓冲区
    char c[100]={'\0'},s[100]={'\0'};
    FILE *fp;
    int i,j;
    printf("我是fread_fwrite函数\n\n");
    if((fp=fopen("fread_fwrite.txt", "w+"))==NULL)
    {
        printf("fputs_fgets失败了");
        exit(1);
    }
    for(i=0;(c[i]=getchar())!='#';i++);
    c[i]='\0';
    fwrite(c,(strlen(c)+1),1,fp);
    rewind(fp);//让指针回到开头
    fread(s,1,(strlen(c)+1),fp);//将fp文件指针所指的字符串读出100位赋值给s指针
            printf("%s",s);
    fclose(fp);
    printf("\nfread_fwrite函数结束了\n\n");
}
void fprintf_fscanf()
{
    while (getchar() != '\n');//清空缓冲区
    char c[100]={'\0'},s[100]={'\0'};
    FILE *fp;
    int i,j;
    printf("我是fprintf_fscanf函数\n\n");
    if((fp=fopen("fprintf_fscanf.txt", "w+"))==NULL)
    {
        printf("fprintf_fscanf失败了");
        exit(1);
    }
    for(i=0;(c[i]=getchar())!='#';i++);
    c[i]='\0';
    while (getchar() != '\n');//清空缓冲区
    for(i=0;(s[i]=getchar())!='#';i++);
    s[i]='\0';
    while (getchar() != '\n');//清空缓冲区
    fprintf(fp,"%s %s\n",c,s);
    rewind(fp);//让指针回到开头
    fscanf(fp,"%s %s\n",s,c);
    fclose(fp);
    printf("%s\n",c);
    printf("%s\n",s);
    printf("\nfprintf_fscanf函数结束了\n\n");
}
void main()
{
    fputc_fgetc();
    fputs_fgets();
    fread_fwrite();
    fprintf_fscanf();
}

(代码仅仅针对各种输出和输入写了函数,其他的实例可以自行尝试。)





文章评论

    Heven Kin 访客ChromeAndroid
    2019-08-7 12:18   回复

    都七夕了还敲什么代码啊

      半叶子 站长ChromeWindows
      2019-08-7 12:42   回复

      那是别人的七夕

    墨兰 访客ChromeAndroid
    2019-08-7 8:28   回复

    都七夕了还敲什么代码啊

      半叶子 站长ChromeWindows
      2019-08-7 9:36   回复

      过啥七夕,还是撸代码重要