• C语言文件操作详解


    C文件概述

    1、所谓“文件”是指一组相关数据的有序集合。

    2、这个数据集合有一个名称,叫做文件名

    3、文件通常是驻留在外部介质(如磁盘等)上的,在使用时才调入内存中来

    4、操作系统是以文件为单位对数据进行管理的

     

    文件分类

    1、从用户观点:

      a) 特俗文件(标准输入输出文件或标准设备文件)

      b) 普通文件(磁盘文件)

    2、从操作系统的角度看,每个与主机相连的输入、输出设备看作是一个文件

    3、按数据的组织形式:

      a) ASCII文件(文本文件):每一个字节放一个ASCII代码

    b) 二进制文件:把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放

     

    C语言对文件的处理方法

    缓冲文件系统:系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。用缓冲文件系统进行的输入输出又称为高级磁盘输入输出。

    非缓冲文件系统:系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。用非缓冲文件系统进行的输入输出又称为低级输入输出系统。

     

    文件的打开与关闭

    1、文件的打开(fopen函数)

    2、文件的关闭(fclose函数)

    函数功能:使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作

    返回值:关闭成功返回值为0;否则返回EOF-1

     

    使用文件的方式共有12种,下面给出了它们的符号和意义。

     文件使用方式

                 意义

       “r”

       只读打开一个文本文件,只允许读数据

       “w”

       只写打开或建立一个文本文件,只允许写数据

       “a”

       追加打开一个文本文件,并在文件末尾写数据

       “rb”

       只读打开一个二进制文件,只允许读数据

       “wb”

       只写打开或建立一个二进制文件,只允许写数据

       “ab”

       追加打开一个二进制文件,并在文件末尾写数据

       “r+”

      读写打开一个文本文件,允许读和写

       “w+”

      读写打开或建立一个文本文件,允许读写

       “at+”

      读写打开一个文本文件,允许读,或在文件末追加数据

       “rb+”

      读写打开一个二进制文件,允许读和写

       “wb+”

      读写打开或建立一个二进制文件,允许读和写

       “ab+”

      读写打开一个二进制文件,允许读,或在文件末追加数据

     

     

    文件的读写

    字符读写函数: fgetc 和 fputc

    1、在文件内部有一个位置指针,用来指向文件的当前读写字节

    2、在文件打开时,该指针总是指向文件的第一个字节,只用fgetc函数后,该位置指针将向后移动一个字节,因此可连续多次使用fgetc函数,读取多个字符

    3、文件指针和未见内部的位置指针不是一回事

    4、文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的

    5、文件内部的位置指针用以知识文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需要在程序中定义说明,而是由系统自动设置的

     

    fputc(ch, fp);

    函数功能: 将字符(ch的值)输出到fp所指向的文件中去

     

    /*

    2011092121 5459 

    功能:

    字符读写函数: fgetc 和 fputc

    fputc(ch, fp);

    函数功能: 将字符(ch的值)输出到fp所指向的文件中去

    */

    #include <stdio.h>

    #include <stdlib.h>

     

    void main()

    {

    FILE * fp;

    char ch, filename[20];

     

    printf("Please input the filename you want to write:");

    scanf("%s", filename);

     

    if(!(fp = fopen(filename, "wt++"))) //  文件的打开(fopen函数);  wt+” 读写打开或建立一个文本文件,允许读写

    {

    printf("Cannot open the file!\n");

    exit(0);//终止程序

    }

     

    printf("Please input the sentences you want to write:");

    ch = getchar(); 

    ch = getchar();

    while( ch != EOF) //EOF为文件结束

    {

    fputc(ch, fp); //fputc(ch, fp); 函数功能: 将字符(ch的值)输出到fp所指向的文件中去

    ch = getchar();

    }

     

    fclose(fp);

    }

     

     

     

    /*

    2011092122 2329 

    */

    #include <stdio.h>

    #include <stdlib.h>

     

    void main()

    {

    FILE * fp;

    char ch, filename[20];

     

    printf("Please input the filename you want to write:");

    scanf("%s", filename);

     

    if(!(fp = fopen(filename, "r"))) //  文件的打开(fopen函数);  wt+” 读写打开或建立一个文本文件,允许读写

    {

    printf("Cannot open the file!\n");

    exit(0);//终止程序

    }

     

    while( ch != EOF) //EOF为文件结束 EOF 也就等价于 -1 表示读到文件末尾了 或者说 是 文件的结束符

    {

    ch = fgetc(fp);

    putchar(ch); //putchar();用于把ch显示在屏幕上

    }

     

    fclose(fp);

    }

     

     

    /*

    2011092513 0329 

    功能:

    完成文本文件的复制

    */

    #include <stdio.h>

    #include <stdlib.h>

     

    int main(void)

    {

    FILE *in, *out;

     

    char infile[10];

    char outfile[10];

    char c;

     

    printf("enter the infile name:\n");

    scanf("%s", infile);

     

    printf("enter the outfile name:\n");

    scanf("%s", outfile);

     

    if( (in=fopen(infile, "r")) == NULL ) //   r 只读打开一个文本文件,只允许读数据

    exit(0);

     

    if( (out=fopen(outfile, "w")) == NULL ) //   w” 只写打开或建立一个文本文件,只允许写数据

    exit(0);

     

    c=fgetc(in); //fgetc(), getc() 从指定文件取得一个字符

    while(!feof(in)) //文件状态 feof() 若到文件末尾,函数值为真

    {

    fputc(c, out); //fputc(), putc() 把字符输出到指定文件

    c=fgetc(in);

    }

     

    fclose(in);

    fclose(out);

     

    return 0;

    }

     

     

    /*

    2011092513 1003 

    功能:

    完成二进制文件的复制

    */

    #include <stdio.h>

    #include <stdlib.h>

     

    int main(void)

    {

    FILE *in, *out;

     

    char infile[10];

    char outfile[10];

    char c;

     

    printf("enter the infile name:\n");

    scanf("%s", infile);

     

    printf("enter the outfile name:\n");

    scanf("%s", outfile);

     

    if( (in=fopen(infile, "rb")) == NULL ) //     rb    只读打开一个二进制文件,只允许读数据

    exit(0);

     

    if( (out=fopen(outfile, "wb")) == NULL ) //      wb    只写打开或建立一个二进制文件,只允许写数据

    exit(0);

     

    c=fgetc(in); //fgetc(), getc() 从指定文件取得一个字符

    while(!feof(in)) //文件状态 feof() 若到文件末尾,函数值为真

    {

    fputc(c, out); //fputc(), putc() 把字符输出到指定文件

    c=fgetc(in);

    }

     

    fclose(in);

    fclose(out);

     

    return 0;

    }

     

    字符串读写函数:fgets 和 fputs

    1、只能处理文本文件,不能处理二进制文件

    2、返回值:

    1. 输入成功:返回值为0

    2. 输入失败:返回EOF

     

    例一:字符串写入:

    /*

    2011092221 5225 

     

    字符串读写函数:fgets 和 fputs

    返回值:

    1. 输入成功:返回值为0

    2. 输入失败:返回EOF

    */

     

    #include <stdio.h>

    #include <stdlib.h>

     

    #define LEN 11;

     

    void main()

    {

    FILE * fp;

     

    char buffer[30], ch;

     

    if( !(fp = fopen("qintangtao.txt", "at+")) ) //   at+” 读写打开一个文本文件,允许读,或在文件末追加数据 文件指针指向了文件的结尾处

    {

    printf("\nCannot open file strike any key exit!");

    exit(1);

    }

     

    printf("Please input a string:\n");

    // scanf("%s", buffer);  // scanf();接收时 当遇到 空格、换行 就认为结束了

     

    fgets(buffer, 30, stdin); //为什么不用scanf()? stdin又是什么?

     

    fputs(buffer, fp);

     

    rewind(fp); //重新定义文件内部指针指向文件的开头处

     

    ch = fgetc(fp);

     

    while( ch != EOF )

    {

    putchar(ch); //输出到屏幕上

    ch = fgetc(fp);

    }

     

    printf("\n");

     

    fclose(fp);

     

    system("pause");

    }

     

    例二:字符串读出

    /*

    2011092219 4044 

    总结:

    字符串读写函数:fgets 和 fputs

    */

     

    #include <stdio.h>

    #include <stdlib.h>

     

    #define LEN 11;

     

    void main()

    {

    FILE * fp;

     

    char buffer[11];

     

    if( !(fp = fopen("qintangtao.txt", "rt")) ) //是否能够打开文件

    {

    printf("\nCannot open file strike any key exit!");

    exit(1);

    }

     

    fgets(buffer, 11, fp); //fp中读出11个字节存放在buffer

     

    printf("%s\n", buffer);

     

    fclose(fp);

     

    system("pause");

    }

     

     

    /*

    2011092514 0549 

    功能:

    输入学生的信息存入student.txt文件中

    */

    #include <stdio.h>

    #include <stdlib.h>

     

    int main(void)

    {

    FILE * fp;

    char student[50];

    int i;

    //scanf("%s", student); // 当输入 1001 tom 92.3  时 只能把1001存入文件中 因为在遇到空格时 scanf就把它当成了结束的标记 所以要用下面的  gets(student); 来进行输入

     

    if( (fp=fopen("student.txt", "w"))==NULL )

    exit(0);

     

    for(i=0; i<3; i++)

    {

    gets(student);

    fputs(student, fp); //整行的存入文件中

    fputs("\n", fp); //换行

    }

     

    return 0;

    }

     

    /*

    2011092514 1713 

    功能:

    student.txt文件中读取数据并显示在屏幕上

    */

    #include <stdio.h>

    #include <stdlib.h>

     

    int main(void)

    {

    FILE * fp;

     

    char string[80];

     

    if( (fp=fopen("student.txt", "r"))==NULL )

    exit(0);

     

    while( fgets(string, 80, fp)!=NULL )

    {

    //printf("%s", string); //也可以用下面的方法将内容显示在屏幕上

    fputs(string, stdout); //stdout函数是将内容显示到屏幕上

    }

     

     

    return 0;

    }

    数据块(二进制文件的)读写函数:fread 和 fwrite

    函数调用:

    fread(buffer, size, count, fp);

    fwrite(buffer, size, count, fp);

     

    参数说明:

    buffer: 是一个指针

    fread来说,它是读入数据的存放地址

    fwrite来说,是要输出数据的地址(均指起始地址)

    size: 要读写的字节数

    count:要进行读写多少个size字节的数据项

    fp:文件指针

     

    例一:数据块写入:

    /*

    2011092223 0125 

    总结:

    函数调用:

    fread(buffer, size, count, fp);

    fwrite(buffer, size, count, fp);

     

    参数说明:

    buffer: 是一个指针

    fread来说,它是读入数据的存放地址

    fwrite来说,是要输出数据的地址(均指起始地址)

    size: 要读写的字节数

    Count:要进行读写多少个size字节的数据项

    fp:文件的指针

    */

     

    #include <stdio.h>

     

    #define SIZE 4

     

    struct student

    {

    char name[10];

    int num;

    int age;

    char addr[15];

    }stu[SIZE];

     

    void save()

    {

    FILE *fp;

    int i;

     

    if( !(fp = fopen("student-list", "wb")) ) // wb” 只写打开或建立一个二进制文件,只允许写数据

    {

    printf("Cannot open the file!\n");

    return;

    }

     

    for( i=0; i<SIZE; i++ )

    {

    if( fwrite(&stu[i], sizeof(struct student), 1, fp) !=1 )  //fwrite(buffer, size, count, fp);

    {

    printf("File write error!\n");

    fclose(fp);

    }

    }

    }

     

     

     

    void main()

    {

    int i;

     

    printf("Please input the student's name, num, age and address: \n");

    for ( i=0; i<SIZE; i++ )

    {

    scanf("%s %d %d %s", &stu[i].name, &stu[i].num, &stu[i].age, &stu[i].addr );

    }

     

    save();

    }

     

    例二:数据块读出:

    /*

    2011092223 0330 

    总结:

    函数调用:

    fread(buffer, size, count, fp);

    fwrite(buffer, size, count, fp);

     

    参数说明:

    buffer: 是一个指针

    fread来说,它是读入数据的存放地址

    fwrite来说,是要输出数据的地址(均指起始地址)

    size: 要读写的字节数

    Count:要进行读写多少个size字节的数据项

    fp:文件的指针

    */

     

    #include <stdio.h>

     

    #define SIZE 4

     

    struct student

    {

    char name[10];

    int num;

    int age;

    char addr[15];

    }stu[SIZE];

     

    //函数声明

    void load();

     

    void main()

    {

    int i;

     

    load();

    printf("      name     num    age      adress\n\n");

    for ( i=0; i<SIZE; i++ )

    {

    printf("%10s %5d %5d %10s \n", &stu[i].name, &stu[i].num, &stu[i].age, &stu[i].addr );

    }

     

     

    }

     

    void load()

    {

    FILE *fp;

    int i;

     

    if( !(fp = fopen("student-list", "r")) )

    {

    printf("Cannot open the file!\n");

    return;

    }

     

    for( i=0; i<SIZE; i++ )

    {

    fread(&stu[i], sizeof(struct student), 1, fp); //fread(buffer, size, count, fp);

    }

     

    fclose(fp);

    };

     

     

    /*

    2011092520 1022 

    功能:

    据块(二进制文件的)读写函数:fread 和 fwrite

    函数调用:

    fread(buffer, size, count, fp);

    fwrite(buffer, size, count, fp);

     

    参数说明:

    buffer: 是一个指针

    fread来说,它是读入数据的存放地址

    fwrite来说,是要输出数据的地址(均指起始地址)

    size: 要读写的字节数

    count:要进行读写多少个size字节的数据项

    fp:文件指针

    */

    #include <stdio.h>

    #include <stdlib.h>

     

    struct student

    {

    long num;

    char name[10];

    int age;

    } s[4];

     

    int main(void)

    {

    FILE * fp;

    int i;

     

    if( (fp=fopen("student.dat", "w+")) == NULL ) //  w+”读写打开或建立一个文本文件,允许读写

    exit(0);

     

    for(i=0; i<4; i++)

    {

    printf("%d个学生:\n", i+1);

    printf("学号:");

    scanf("%ld", &s[i].num);

    printf("姓名:");

    scanf("%s", s[i].name);

    printf("年龄:");

    scanf("%d", &s[i].age);

    //fwrite(&s, sizeof(struct student), 1, fp); // fwrite(buffer, size, count, fp);

    }

     

    fwrite(s, sizeof(struct student), 4, fp);

     

    rewind(fp); //文件内部指针指向第一个字节

     

    // for(j=0; j<4; j++)

    // {

    // fread(&s, sizeof(struct student), 1, fp); // fread(buffer, size, count, fp);

    // printf("%ld %s %d\n", s.num, s.name, s.age);

    // }

     

    fread(s, sizeof(struct student), 4, fp); 

     

    for(i=0; i<4; i++)

    {

    printf("%ld %s %d\n", s[i].num, s[i].name, s[i].age);

    }

     

    fclose(fp);

     

    return 0;

    }

     

     

    格式化读写函数: fscanf fprinf 

    函数调用:

    fprintf(文件指针, 格式字符串, 输出表列);

    fscanf(文件指针, 格式字符串, 输入表列);

     

    函数功能:

    从磁盘文件中按格式读入或输出字符。

    例如:

    fprintf(fp, "%d %6.2f", i, t);

    fscanf(fp, "%d %f", &i, &t);

     

     

    /*

    2011092514 5607 

    函数调用:

    fprintf(文件指针, 格式字符串, 输出表列);

    fscanf(文件指针, 格式字符串, 输入表列);

     

    函数功能:

    从磁盘文件中按格式读入或输出字符。

    */

    #include <stdio.h>

     

    FILE *stream;

     

    void main( void )

    {

       long l;

       float fp;

       char s[81];

       char c;

     

       stream = fopen( "fscanf.out", "w+" ); //   w+   读写打开或建立一个文本文件,允许读写

       if( stream == NULL )

          printf( "The file fscanf.out was not opened\n" );

       else

       {

          fprintf( stream, "%s %ld %f%c", "a-string",  //为什么%f%c之间没有空格 fscanf( stream, "%c", &c );  才能把'x'读取出来?

                   65000, 3.14159, 'x' );

     

          /* Set pointer to beginning of file: */

          fseek( stream, 0L, SEEK_SET );//  改变文件的位置指针  fseek(文件类型指针, 位移量, 起始点); 

    /*

    文件开头             SEEK_SET  0

    文件当前位置      SEEK_CUR  1

    文件末尾            SEEK_END 2

    */

     

          /* Read data back from file: */

          fscanf( stream, "%s", s );    //按照什么顺序输入就按照什么顺序输出

          fscanf( stream, "%ld", &l );

          fscanf( stream, "%f", &fp );

          fscanf( stream, "%c", &c );  

     

          /* Output data read: */

          printf( "%s\n", s );

          printf( "%ld\n", l );

          printf( "%f\n", fp );

          printf( "%c\n", c );

     

          fclose( stream );

       }

    }

     

     

    /*

    2011092514 4007 

    功能:

    函数调用:

    fprintf(文件指针, 格式字符串, 输出表列);

    函数功能:

    从磁盘文件中按格式输出字符。

    */

    #include <stdio.h>

    #include <stdlib.h>

     

    int main(void)

    {

    int i = 10;

    double fp = 1.5;

    char s[]="this is a string!";

    char c = '\n';

     

    FILE * stream;

     

    stream = fopen("fprintf.out", "w");

    fprintf(stream, "%s%c", s, c);

    fprintf(stream, "%d\n", i);

    fprintf(stream, "%f\n", fp);

    fclose(stream);

    system("type fprintf.out"); //此函数是将fprintf.out文件中的内容显示在屏幕上

     

    return 0;

    }

     

    /*

    2011092514 4007 

    功能:

    格式化输入学生信息-fprintf.c

     

    函数调用:

    fprintf(文件指针, 格式字符串, 输出表列);

    函数功能:

    从磁盘文件中按格式输出字符。

    */

    #include <stdio.h>

    #include <stdlib.h>

     

    int main(void)

    {

    FILE * fp;

    long num;

    char name[10];

    int age;

    int i;

     

    if( (fp=fopen("stuendt.txt", "w")) == NULL )

    exit(0);

     

    for(i=0; i<5; i++)

    {

    printf("%d个学生:\n", i+1);

    printf("学号:");

    scanf("%ld", &num);

     

    printf("姓名:");

    scanf("%s", name);

     

    printf("年龄:");

    scanf("%d", &age);

     

    fprintf(fp, "学号:%ld 姓名:%9s 年龄: %d\n", num, name, age);

    }

     

     

    fclose(fp);

     

    return 0;

    }

     

    /*

    2011092515 3736 

    功能:

    格式化输出学生信息-fscanf.c

     

    函数调用:

    fscanf(文件指针, 格式字符串, 输入表列);

     

    函数功能:

    从磁盘文件中按格式字符。

    */

    #include <stdio.h>

    #include <stdlib.h>

     

    int main(void)

    {

    FILE * fp;

    long num;

    char name[10];

    int age;

     

    if( (fp=fopen("stuendt.txt", "r")) == NULL )

    exit(0);

     

    while( !feof(fp))

    {

    // fprintf(fp, "学号:%ld 姓名:%9s 年龄: %d\n", num, name, age);

    fscanf(fp, "学号:%ld 姓名:%9s 年龄: %d\n", &num, name, &age); //一定要按照 fprintf(fp, "学号:%ld 姓名:%9s 年龄: %d\n", num, name, age); 中存入的格式来读取

    printf("%ld %s %d\n", num, name, age);

    }

     

     

    fclose(fp);

     

    return 0;

    }

     

    顺序读写和随机读写

    顺序读写:

    位置指针按字节位置顺序移动

     

    随机读写:fseek函数

    读写完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读写文件中任意位置上多需要的字符(字节)

     

    函数功能:

    改变文件的位置指针

     

    函数的调用形式:

    fseek(文件类型指针, 位移量, 起始点);

     

    参数:

    起始点:

    文件开头            SEEK_SET  0

    文件当前位置      SEEK_CUR  1

    文件末尾           SEEK_END 2

     

    例如:

    fseek(fp, 100L, 0);

    将位置指针移到离文件头100个字节处

     

    fseek(fp,50L, 1);

    将位置指针移到离当前位置50个字节处

     

    fseek(fp,10L, 2);

    将位置指针从文件末尾处向后退10个字节

     

    例子:

    /*

    2011092223 3853 

    总结:

    顺序读写和随机读写

    顺序读写:

    位置指针按字节位置顺序移动

     

    随机读写:fseek函数

    读写完上一个字符(字节)后,并不一定要读写其后续的字符(字节),而可以读写文件中任意位置上多需要的字符(字节)

     

    函数功能:

    改变文件的位置指针

     

    函数的调用形式:

    fseek(文件类型指针, 位移量, 起始点);

     

    参数:

    起始点:

    文件开头            SEEK_SET  0

    文件当前位置 SEEK_CUR  1

    文件末尾 SEEK_END 2

     

    例如:

    fseek(fp, 100L, 0);

    将位置指针移到离文件头100个字节处

     

    fseek(fp,50L, 1);

    将位置指针移到离当前位置50个字节处

     

    fseek(fp,10L, 2);

    将位置指针从文件末尾处向后退10个字节

    */

    #include <stdio.h>

    #include <stdlib.h>

     

    struct student

    {

    char name[10];

    int num;

    int age;

    char addr[15];

    }boy;

     

    void main()

    {

    FILE *fp;

     

    int i=1; //用于定位第 个结构

     

    if( !(fp = fopen("student-list", "r")) )

    {

    printf("Cannot open the file!\n");

    return;

    }

     

    rewind(fp); //设置文件内部指针指向文件头

     

    fseek(fp, i*sizeof(struct student), 0); // fseek(文件类型指针, 位移量, 起始点);

    fread(&boy, sizeof(struct student), 1, fp); //数据块读写函数:freed :   fread(buffer, size, count, fp);

    //读取一个学生的容量

    /*

    参数说明:

    buffer: 是一个指针

    fread来说,它是读入数据的存放地址

    fwrite来说,是要输出数据的地址(均指起始地址)

    size: 要读写的字节数

    count:要进行读写多少个size字节的数据项

    fp:文件指针

    */

    printf("name number    age    addr\n");

    printf("%s %5d   %7d      %s\n", boy.name, boy.age, boy.addr);

     

    }

     

     

     

    /*

    2011092522 0236 

    功能:

    函数的调用形式:

    fseek(文件类型指针, 位移量, 起始点);

     

    参数:

    起始点:

    文件开头            SEEK_SET  0

    文件当前位置 SEEK_CUR  1

    文件末尾 SEEK_END 2

     

    例如:

    fseek(fp, 100L, 0);

    将位置指针移到离文件头100个字节处

     

    fseek(fp,50L, 1);

    将位置指针移到离当前位置50个字节处

     

    fseek(fp,10L, 2);

    将位置指针从文件末尾处向后退10个字节

    */

    #include <stdio.h>

    #include <stdlib.h>

     

    struct student

    {

    long num;

    char name[10];

    int age;

    }s[10];

     

    int main(void)

    {

    FILE *fp;

    int i;

    struct student stu;

     

    if( (fp=(fopen("student.dat", "w+"))) == NULL )

    exit(0);

     

    for(i=0; i<10; i++)

    {

    printf("%d个学生:\n", i+1);

    printf("学号:");

    scanf("%ld", &s[i].num);

    printf("姓名:");

    scanf("%s", s[i].name);

    printf("年龄:");

    scanf("%d", &s[i].age);

    }

     

    fwrite(s, sizeof(struct student), 10, fp);

     

    for(i=1; i<=9; i=i+2)

    {

    fseek(fp, (i-1)*sizeof(struct student), SEEK_SET);

    fread(&stu, sizeof(struct student), 1, fp);

    printf("%ld %s %d", stu.num, stu.name, stu.age);

    }

     

    fclose(fp);

    return 0;

    }

     

     

    文件定位:

    文件中有一个位置指针,指向当前读写的位置,如果顺序读写一个文件,每次读写一个字符,则读写完一个字符后,该位置指针自动移动指向下一个字符位置。如果想改变这样的规律,强制使位置指针指向其他指定的位置。可以用下面介绍的有关函数实现上述功能:

     

    1、rewind函数

    rewind函数的作用是使指针重新返回文件的开头,此函数没有返回值

     

    /*

    2011092520 2838 

    功能:

    stuendt.txt文件中的内容读取出来显示在屏幕上

    然后将stuendt.txt中的内容复制到stuendt2.txt文件中

     

    注意:

    rewind函数的作用是使指针重新返回文件的开头,此函数没有返回值

    */

    #include <stdio.h>

    #include <stdlib.h>

     

    int main(void)

    {

    FILE * fp;

    FILE * f;

    char c;

     

    if( (fp=fopen("stuendt.txt", "r")) == NULL )

    exit(0);

     

    c=fgetc(fp);

    while(!feof(fp) )

    {

    // printf("%c", c);

    fputc(c, stdout); //以上两种方式都可以将stuendt.txt中的内容打印到屏幕上  stdout函数就是将内容显示在屏幕上

    c=fgetc(fp); 

    }

     

    if( (f=fopen("stuendt2.txt", "w")) == NULL )

    exit(0);

     

    rewind(fp); // rewind函数的作用是使指针重新返回文件的开头,此函数没有返回值

     

    while(!feof(fp) )

    {

    fputc(c, f); //当向stuendt2.txt中写入一个字符后文件内部指针就会自动指向后一个字节

    c=fgetc(fp); 

    }

     

    fclose(fp);

    fclose(f);

     

    return 0;

    }

     

     

     

    ftell函数:

    long ftell( FILE *stream );

    函数作用:

    得到流式文件中的当前位置,用相对于文件开头的位移量来表示。

     

    返回值:

    返回当前位置,出错时返回-1L

     

    应用举例:

    i = ftell(fp);

    if( i == -1L)

    printf("error\n");

     

     

    /*

    2011092619 1434 

    功能:

    函数格式:

    long ftell( FILE *stream );

    函数作用:

    得到流式文件中的当前位置,用相对于文件开头的位移量来表示。

     

    返回值:

    返回当前位置,出错时返回-1L

     

    */

    #include <stdio.h>

    #include <stdlib.h>

     

    int main(void)

    {

    FILE * stream;

    long position;

    char list[100];

    if( (stream = fopen("我把的后缀换成zip.gif", "rb")) != NULL )

    {

    fread(list, sizeof(char), 100, stream);  // fread(buffer, size, count, fp); 从“我把的后缀换成zip.gif”文件中读取100个字节放到list中 此时文件内部指针指向的位置由 long ftell( FILE *stream ); 来判断

    position = ftell(stream);  //long ftell( FILE *stream );    得到流式文件中的当前位置,用相对于文件开头的位移量来表示。

    printf("Position after trying to read 100 bytes: %ld\n", position);

    fclose(stream);

    }

     

    return 0;

    }

     

    出错的检测

    ferror函数

     

    调用形式:

    ferror(fp);

     

    返回值:

    返回0,表示未出错;返回非0,表示出错

     

    注意:

    在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动设置为0

     

    /*

    2011092619 3631 

      功能:

    调用形式:

    ferror(fp);

     

    返回值:

    返回0,表示未出错;返回非0,表示出错

     

    注意:

    在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动设置为0

     

     

    注意:

    1、在读取文件时可能返回的字节数比实际文件的字节要小也可能相等

    2、当要小的时候,是因为在文件中有换行符 在文件中换行符占两个字节,但fread函数在读取换行符的时候 会将换行符所占的两个字节读取成一个字节

    3、当文件中只有一行数据,并且也不存在换行符,此时读取的字节数就等于文件所占的字节

    */

     

    #include <stdio.h>

    #include <stdlib.h>

     

    void main( void )

    {

       int  count, total = 0;

       char buffer[100];

       FILE *stream;

     

       if( (stream = fopen( "qintangtao.txt", "r" )) == NULL )

          exit( 1 );

     

       /* Cycle until end of file reached: */

       while( !feof( stream ) )

       {

          /* Attempt to read in 10 bytes: */

          count = fread( buffer, sizeof( char ), 100, stream ); //fread函数可以读取二进制文件 也可以读文本文件

          if( ferror( stream ) )    //int ferror( FILE *stream );  返回0,表示未出错;返回非0,表示出错

      {

             perror( "Read error" );

             break;

          }

     

          /* Total up actual bytes read */

          total += count;

       }

       printf( "Number of bytes read = %d\n", total );

       fclose( stream );

    }

     

     

     

    clearerr函数

    void clearerr( FILE *stream );

    调用形式:

    clearerr(fp);

     

    函数作用:

    使文件错误标志和文件结束标志设置为0

     

    注意:

    只要出现错误标志,就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数

     

    /*

    2011092620 1218 

    功能:

    void clearerr( FILE *stream );

     

    调用形式:

    clearerr(fp);

     

    函数作用:

    使文件错误标志和文件结束标志设置为0

     

    注意:

    只要出现错误标志,就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数

    */

    #include <stdio.h>

     

    void main( void )

    {

       int c;

       /* Create an error by writing to standard input. */

       putc( 'c', stdin );

       if( ferror( stdin ) )

       {

          perror( "Write error" );

          clearerr( stdin ); //当出现错误时 用clearerr清除错误 

       }

      

     

       /* See if read causes an error. */

       printf( "Will input cause an error? " );

       c = getc( stdin );

       if( ferror( stdin ) )

       {

          perror( "Read error" );

          clearerr( stdin );

       }

      

    }

     

     

     

    以上函数都要求包含头文件stdio.h

     

    文件操作小结:

    分类

    函数名

    功能

    打开文件

    fopen()

    打开文件

    关闭文件

    fclose()

    关闭文件

    文件定位

    fseek()

    改变文件位置指针的位置

    rewind()

    使文件位置指针重新至于文件开头

    ftell()

    返回未见位置指针的当前值

    文件状态

    feof()

    若到文件末尾,函数值为真

    ferror()

    若对文件操作出错,函数值为真

    clearerr()

    使ferrorfeof函数值置零

    文件读写

    fgetc(), getc()

    从指定文件取得一个字符

    fputc(), putc()

    把字符输出到指定文件

    fgets()

    从指定文件读取字符串

    fputs()

    把字符串输出到指定文件

    getw()

    从指定文件读取一个字(int型)

    putw()

    把一个字输出到指定文件

    fread()

    从指定文件中读取数据项

    fwrite()

    把数据项写到指定文件中

    fscanf()

    从指定文件按格式输入数据

    fprintf()

    按指定格式将数据写到指定文件中

     

     

    C\C++ 关于FILE结构定义说明

    此结构VC定义于stdio.h头文件中,

    struct   _iobuf   


         char   *_ptr;            //文件输入的下一个位置 

      int    _cnt;           //当前缓冲区的相对位置 
         char   *_base;          //指基础位置(应该是文件的其始位置
         int    _flag;           //文件标志 
         int    _file;          //文件的有效性验证 
         int    _charbuf;    //检查缓冲区状况,如果无缓冲区则不读取 
         int    _bufsiz;      //文件的大小 
         char   *_tmpfname; //临时文件名 
    };
    typedef   struct   _iobuf   FILE; 

  • 相关阅读:
    python切片操作
    python中的内存管理
    python中x,y交换值的问题
    leetcode6:Zigzag Conversion@Python
    Leetcode4:Median of Two Sorted Arrays@Python
    Leetcode3:Longest Substring Without Repeating Characters@Python
    Leetcode2:Add Two Numbers@Python
    LeetCode344:Reverse String@Python
    支付宝 芝麻信用分过600,你不知道的八个特权
    穷爸爸富爸爸里面说的“现金流游戏”靠谱吗?
  • 原文地址:https://www.cnblogs.com/qintangtao/p/2863347.html
Copyright © 2020-2023  润新知