精华内容
下载资源
问答
  • C语言的文件操作

    2020-11-23 20:36:46
    我们首先了解一下 文件基本内容: 什么是文件 磁盘上文件是文件。但在程序设计中,我们一般...根据数据组织形式,数据文件被称为文本文件或者二进制文件。 二进制文件: 数据在内存中以二进制形式存储,如果

    我们首先了解一下
    文件的基本内容:

    1. 什么是文件
      磁盘上的文件是文件。但在程序设计中,我们一般涉及到两个文件:程序文件、数据文件。
      程序文件:
      包括源程序文件(后缀为.c)、目标文件(windows环境后缀为.obj)、可执行程序(windows环境后缀为 .exe)
      数据文件:
      文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行时需要从中读取数据的文件,或者输出内容的文件。
    2. 文件类型
      根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
      二进制文件:
      数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
      文本文件:
      如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
      数据在内存中的存储:
      字符一律以ASCII 码形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储
    3. 文件缓冲区
      ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在
      使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘
      上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐
      个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定。
      在这里插入图片描述

    文件指针
    每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及
    文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE.
    我们一般都是通过一个FILE的指针来维护这个FILE结构的变量。

    创建一个FILE*指针变量

    FILE* pf;//文件指针变量
    

    定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文
    件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。

    文件的打开与关闭
    文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
    ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。

    FILE * fopen ( const char * filename, const char * mode );
    int fclose ( FILE * stream );
    

    文件的打开方式如下:

    文件使用方式 含义 如果指定文件不存在
    “r”(只读) 为了输入数据,打开一个已经存在的文本文件 出错
    “w”(只写) 为了输出数据,打开一个文本文件 建立一个新的文件
    “a”(追加) 向文本文件尾添加数据 出错
    “rb”(只读) 为了输入数据,打开一个二进制文件 出错
    “wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件
    “ab”(追加) 向一个二进制文件尾添加数据 出错
    “r+”(读写) 为了读和写,打开一个文本文件 出错
    “w+”(读写) 为了读和写,建立一个文本文件 建立一个新的文件
    “a+”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件
    “rb+”(读写) 为了读和写,打开一个二进制文件 出错
    “wb+”(读写) 为了读和写,新建一个二进制文件 建立一个新的文件
    “ab+”(读写) 打开一个二进制文件,在文件尾进行读写 建立一个新的文件

    每次打开文件的时候,都需要判断文件是否打开;关闭文件时,也应该将文件指针 置为空指针NULL。
    举例:

    #include<stdio.h>
    int main()
    {
    FILE* pf=fopen("text.txt","w");
    if(pf==NULL)
    {
    perror("open file for writing");
    }
    floce(pf);
    pf=NULL;
    }
    

    文件的顺序读写

    功能 函数名 适用于
    字符输入函数 fgetc 所有输入流
    字符输出函数 fputc 所有输出流
    文本行输入函数 fgets 所有输入流
    文本行输出函数 fputs 所有输出流
    格式化输入函数 fscanf 所有输入流
    格式化输出函数 fprintf 所有输出流
    二进制输入 fread 文件
    二进制输出 fwrite 文件

    文件的随机读写
    fseek
    根据文件指针的位置和偏移量来定位文件指针。

    int seek(FILE * stream,long int offset,int origin);
    

    ftell
    返回文件指针相对于起始位置的偏移量

    long int ftell ( FILE * stream );
    

    rewind
    让文件指针的位置回到文件的起始位置

    void rewind ( FILE* stream);
    

    文件结束判定

    被错误使用的 feof
    牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
    而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

    1. 文本文件读取是否结束,判断返回值是否为EOF (fgetc),或者NULL(fgets)
      例如:
      fgetc判断是否为EOF.
      fgets判断返回值是否为NULL.
    2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
      例如:
      fread判断返回值是否小于实际要读的个数。
    展开全文
  • [C/C++]C语言中对文件的操作方法

    万次阅读 2021-03-27 17:39:31
    文件类型:根据数据的组织形式,数据文件被称为文本文件或者二进制文件。(存储同样大小的数据,二进制文件大小小于文本文件原因如图) 文件缓冲区:ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲...

    C语言中有许多对文件的操作方法,

    首先我们要明确一些概念,

    在程序设计中,我们一般谈的文件有两种:程序文件、数据文件。

    文件名:一个文件要有一个唯一的文件标识,以便用户识别和引用。文件名包含3部分:文件路径+文件名主干+文件后缀

    文件类型:根据数据的组织形式,数据文件被称为文本文件或者二进制文件。(存储同样大小的数据,二进制文件大小小于文本文件原因如图)

    文件缓冲区:ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。。缓冲区的大小根据C编译系统决定的。

    文件指针:在C语言中用一个指针变量指向一个文件,这个指针称为文件指针。通过文件指针就可对它所指的文件进行各种操作。文件的名字,文件状态及文件当前的位置等。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE.如stdio.h 头文件中有以下的文件类型申明:

    struct _iobuf {
        char *_ptr;
        int _cnt;
        char *_base;
        int _flag;
        int _file;
        int _charbuf;
        int _bufsiz;
        char *_tmpfname;
        };
    typedef struct _iobuf FILE;

    可以通过一个FILE的指针来维护这个FILE结构的变量。创建一个FILE*的指针变量:

    FILE* pf;//文件指针变量

    定义pf是一个指向FILE类型数据的指针变量。通过文件指针变量能够找到与它关联的文件。

     下面介绍一些文件的基本操作函数:

    1.文件的打开和关闭

        文件在读写之前先打开文件,在使用结束后关闭文件。

         ANSIC 规定使用fopen函数打开文件,返回一个FILE*的指针变量指向该文件。fclose来关闭文件。

    FILE * fopen ( const char * filename, const char * mode );
    int fclose ( FILE * stream );

        FILE *fopen(const char *filename, const char *mode);其功能是使用给定的模式 mode 打开 filename 所指向的文件。文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在 error 中。

        int fclose(FILE *stream)关闭流 stream。刷新所有的缓冲区。返回值:如果流成功关闭,fclose 返回 0,否则返回EOF(-1)。(如果流为NULL,而且程序可以继续执行,fclose设定error number给EINVAL,并返回EOF。)

        上边提到的打开方式如下:

         文件使用方式含义如果指定文件不存在
        “r”(只读)   :为了输入数据,打开一个已经存在的文本。如果文件不存在则文件出错。
        “w”(只写)  : 为了输出数据,打开一个文本文件。如果文件不存在则建立一个新的文件。
        “a”(追加)   :向文本文件尾添加数据。如果文件不存在则出错。
        “rb”(只读)  : 为了输入数据,打开一个二进制文件。如果文件不存在则出错。
        “wb”(只写) : 为了输出数据,打开一个二进制文件。如果文件不存在则建立一个新的文件。
        “ab”(追加)  : 向一个二进制文件尾添加数据。如果文件不存在则出错。
        “r+”(读写)   : 为了读和写,打开一个文本文件。如果文件不存在则出错。
        “w+”(读写) : 为了读和写,建议一个新的文件。如果文件不存在则建立一个新的文件。
        “a+”(读写)  : 打开一个文件,在文件尾进行读写。如果文件不存在则建立一个新的文件。
        “rb+”(读写) :为了读和写打开一个二进制文件。如果文件不存在则出错。
        “wb+”(读写): 为了读和写,新建一个新的二进制文件。如果文件不存在则建立一个新的文件。
        “ab+”(读写): 打开一个二进制文件,在文件尾进行读和。如果文件不存在则写建立一个新的文件。

         如:

    #include <stdio.h>
    int main ()
    {
        FILE * pFile;
        pFile = fopen ("myfile.txt","w");
        if (pFile!=NULL)
        {
            fputs ("fopen example",pFile);
            fclose (pFile);
        }
        return 0;
    }

        打开后要判断 pfile指针的有效性。

    2.文件的顺序读写

       介绍一些输入输出函数。

       (1) 字符输入函数int fgetc(FILE *stream) 从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。stream 是指向 FILE 对象的指针,该 FILE 对象标识了要在上面执行操作的流。该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。适用于:所有输入流。

       (2)字符输出函数 int fputc(int char, FILE *stream) 把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。char 是要被写入的字符。该字符以其对应的 int 值进行传递。stream是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符的流。如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF,并设置错误标识符。适用于:所有输入流。

       (3)文本行输入函数char *fgets(char *str, int n, FILE *stream) 从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。str 是指向一个字符数组的指针,该数组存储了要读取的字符串。n 是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。stream是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。如果发生错误,返回一个空指针。适用于:所有输入流。

       (4)文本行输出函数 int fputs(const char *str, FILE *stream) 把字符串写入到指定的流 stream 中,但不包括空字符。str是一个数组,包含了要写入的以空字符终止的字符序列。stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流。该函数返回一个非负值,如果发生错误则返回 EOF。适用于:所有输入流。

       (5) 格式化输入函数int fputs(const char *str, FILE *stream) 把字符串写入到指定的流 stream 中,但不包括空字符。str是一个数组,包含了要写入的以空字符终止的字符序列。stream是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流。该函数返回一个非负值,如果发生错误则返回 EOF。适用于:所有输入流。

       (6)格式化输出函数int fprintf(FILE *stream, const char *format, ...) 发送格式化输出到流 stream 中。stream是指向 FILE 对象的指针,该 FILE 对象标识了流。format是 C 字符串,包含了要被写入到流 stream 中的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。适用于:所有输入流。

       (7) 二进制输入size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 从给定流 stream 读取数据到 ptr 所指向的数组中。ptr 是指向带有最小尺寸 size*nmemb 字节的内存块的指针。size是要读取的每个元素的大小,以字节为单位。nmemb是元素的个数,每个元素的大小为 size 字节。stream是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。适用于:文件。

       (8)二进制输出size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) 把 ptr 所指向的数组中的数据写入到给定流 stream 中。ptr是指向要被写入的元素数组的指针。size 是要被写入的每个元素的大小,以字节为单位.nmemb 是元素的个数,每个元素的大小为 size 字节。stream 是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。适用于:文件。

    3.文件的随机读写

       (1) fseek根据文件指针的位置和偏移量来定位文件指针。

    int fseek ( FILE * stream, long int offset, int origin );

        如果成功,则该函数返回零,否则返回非零值。stream是指向 FILE 对象的指针,该 FILE 对象标识了流。offset 是相对 whence 的偏移量,以字节为单位。whence 是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:

    常量 描述
    SEEK_SET 文件的开头
    SEEK_CUR 文件指针的当前位置
    SEEK_END 文件的末尾

       (2)ftell返回文件指针相对于起始位置的偏移量.

    long int ftell ( FILE * stream );

          stream是指向 FILE 对象的指针,该 FILE 对象标识了流。该函数返回位置标识符的当前值。如果发生错误,则返回 -1L,全局变量 errno 被设置为一个正值。

       (3)rewind让文件指针的位置回到文件的起始位置

    void rewind(FILE *stream)

              stream 是指向 FILE 对象的指针,该 FILE 对象标识了流。

    4.文件结束判定

       int feof(FILE *stream) 测试给定流 stream 的文件结束标识符。

       在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

     (1) 文本文件读取是否结束,判断返回值是否为EOF (fgetc),或者NULL(fgets)例如:fgetc判断是否为EOF.fgets判断返回值是否为NULL。

     (2) 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。例如:fread判断返回值是否小于实际要读的个数。

    文本文件的例子:

    #include <stdio.h>
    #include <stdlib.h>
    int main(void)
    {
        int c; 
        FILE* fp = fopen("test.txt", "r");
        if(!fp) 
            {
                perror("File opening failed");
                return EXIT_FAILURE;
            }
        while ((c = fgetc(fp)) != EOF) 
            {
                putchar(c);
            }
        if (ferror(fp))
            puts("I/O error when reading");
        else if (feof(fp))
            puts("End of file reached successfully");
        fclose(fp);
    }

     

    展开全文
  • C语言文件

    2019-11-18 13:07:28
    生活中的文件 我们对文件的概念已经非常熟悉了,比如常见 Word 文档...通常把显示器称为标准输出文件,printf 就是向这个文件输出,把键盘称为标准输入文件,scanf 就是从这个文件获取数据。 常见硬件设备与文件...

    生活中的文件

    我们对文件的概念已经非常熟悉了,比如常见的 Word 文档、txt 文件、源文件等。文件是数据源的一种,最主要的作用是保存数据。

    c语言中的文件

    在操作系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。

    通常把显示器称为标准输出文件,printf 就是向这个文件输出,把键盘称为标准输入文件,scanf 就是从这个文件获取数据。

    常见硬件设备与文件的对应关系
    文件 硬件设备
    stdin 标准输入文件,一般指键盘;scanf()、getchar() 等函数默认从 stdin 获取输入。
    stdout 标准输出文件,一般指显示器;printf()、putchar() 等函数默认向 stdout 输出数据。                                                 

    文件流

    在《载入内存,让程序运行起来》一文中提到,所有的文件(保存在磁盘)都要载入内存才能处理,所有的数据必须写入文件(磁盘)才不会丢失。数据在文件和内存之间传递的过程叫做文件流,类似水从一个地方流动到另一个地方。数据从文件复制到内存的过程叫做输入流,从内存保存到文件的过程叫做输出流。 

    数据从数据源到程序(内存)的过程叫做输入流(Input Stream),从程序(内存)到数据源的过程叫做输出流(Output Stream)。

    输入输出(Input output,IO)是指程序(内存)与外部设备(键盘、显示器、磁盘、其他计算机等)进行交互的操作。几乎所有的程序都有输入与输出操作,如从键盘上读取数据,从本地或网络上的文件读取数据或写入数据等。通过输入和输出操作可以从外界接收信息,或者是把信息传递给外界

     

    文件的打开(fopen函数)

    fopen() 函数用来打开一个文件,它的原型为:

    FILE *fopen(char *filename, char *mode);

    filename为文件名(包括文件路径),mode为打开方式,它们都是字符串。fopen() 会获取文件信息,包括文件名、文件状态、当前读写位置等,并将这些信息保存到一个FILE类型的结构体变量中,然后将该变量的地址返回。

    FILE是在stdio.h头文件中定义的一个结构体,用来保存文件信息。

    如果希望接收 fopen() 的返回值,就需要定义一个 FILE 类型的指针。例如:

    FILE *fp = fopen("demo.txt", "r");

    表示以“只读”方式打开当前目录下的 demo.txt 文件,并使 fp 指向该文件,这样就可以通过 fp 来操作 demo.txt 了。fp 通常被称为文件指针。又如:

    FILE *fp = fopen("D:\\demo.txt","rb");

    表示以二进制方式打开 D 盘下的 demo.txt 文件,允许读和写。

    打开方式(mode)有多种,见下表:

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

    几点说明

    1) 文件打开方式由r、w、a、t、b、+ 六个字符拼成,各字符的含义是:

    • r(read):读
    • w(write):写
    • a(append):追加
    • t(text):文本文件,可省略不写
    • b(banary):二进制文件
    • +:读和写


    2) 如果没有“b”字符,文件以文本方式打开。

    3) 凡用“r”打开一个文件时,该文件必须已经存在。

    4) 在打开一个文件时,如果出错,fopen将返回一个空指针值NULL。在程序中可以用这一信息来判别是否完成打开文件的工作,并作相应的处理。因此常用以下程序段打开文件:

    
     
    1. if( (fp=fopen("D:\\demo.txt","rb") == NULL ){
    2. printf("Error on open D:\\demo.txt file!");
    3. getch();
    4. exit(1);
    5. }

    这段程序的意义是,如果返回的指针为空,表示不能打开D盘根目录下的 demo.txt 文件,并给出提示信息“error on open D:\\demo.txt file!”。第3行getch()的功能是从键盘输入一个字符,但不在屏幕上显示。在这里,该行的作用是等待,只有当用户从键盘敲任一键时,程序才继续执行,因此用户可利用这个等待时间阅读出错提示。敲键后执行exit(1)退出程序。

    5) 把一个文本文件读入内存时,要将ASCII码转换成二进制码,而把文件以文本方式写入磁盘时,也要把二进制码转换成ASCII码,因此文本文件的读写要花费较多的转换时间。对二进制文件的读写不存在这种转换。

    6) 标准输入文件 stdin(键盘)、标准输出文件 stdout(显示器)、标准错误文件 stderr(显示器)是由系统打开的,可直接使用。

    文件关闭(fclose函数)

    文件一旦使用完毕,应该用fclose()函数把文件关闭,以释放相关资源,避免数据丢失。fclose() 的原型为:

    int fclose(FILE *fp);

    fp 为文件指针。例如:

    fclose(fp);

    文件正常关闭时,fclose() 的返回值为0,如果返回非零值则表示有错误发生。

    字符读取函数 fgetc

    fgetc 是 file get char 的缩写,意思是从指定的文件中读取一个字符。它的原型为:

    int fgetc (FILE *fp);

    fp 为文件指针。fgetc() 读取成功时返回读取到的字符,读取到文件末尾或读取失败时返回EOF

    EOF 是 end of file 的缩写,表示文件末尾,是在 stdio.h 中定义的宏,它的值是一个负数,往往是 -1。返回值类型之所以为 int,就是为了容纳这个负数(char不能是负数)。

    EOF 不绝对是 -1,也可以是其他负数,这要看编译器的实现。

    fgetc() 使用举例:

    
     
    1. char ch;
    2. FILE *fp = fopen("D:\\demo.txt", "r+");
    3. ch = fgetc(fp);

    表示从D:\\demo.txt文件中读取一个字符,并保存到变量ch中。

    在文件内部有一个位置指针,用来指向当前读写到的位置,也就是读写到第几个字节。在文件打开时,该指针总是指向文件的第一个字节。使用fgetc 函数后,该指针会向后移动一个字节,所以可以连续多次使用fgetc读取多个字符。

    注意:这个文件内部的位置指针与C语言中的指针不是一回事。位置指针仅仅是一个标志,表示文件读写到的位置,也就是读写到第几个字节,它不表示地址。文件每读写一次,位置指针就会移动一次,它不需要你在程序中定义和赋值,而是由系统自动设置,对用户是透明的。

    【示例】在屏幕上显示 D:\\demo.txt 文件的内容。

    
     
    1. #include<stdio.h>
    2. int main(){
    3. FILE *fp;
    4. char ch;
    5.  
    6. //如果文件不存在,给出提示并退出
    7. if( (fp=fopen("D:\\demo.txt","rt")) == NULL ){
    8. printf("Cannot open file, press any key to exit!");
    9. getch();
    10. exit(1);
    11. }
    12.  
    13. //每次读取一个字节,直到读取完毕
    14. while( (ch=fgetc(fp)) != EOF ){
    15. putchar(ch);
    16. }
    17. putchar('\n'); //输出换行符
    18. fclose(fp);
    19. return 0;
    20. }

    在D盘下创建demo.txt文件,输入任意内容并保存,运行程序,就会看到刚才输入的内容全部都显示在屏幕上。

    该程序的功能是从文件中逐个读取字符,在屏幕上显示,直到读取完毕。

    程序第14行是关键,while 循环的条件为(ch=fgetc(fp)) != EOF。fget() 每次从位置指针所在的位置读取一个字符,并保存到变量 ch,位置指针向后移动一个字节。当文件指针移动到文件末尾时,fget() 就无法读取字符了,于是返回 EOF,表示文件读取结束了。

    对EOF的说明

    EOF 本来表示文件末尾,意味着读取结束,但是很多函数在读取出错时也返回 EOF,那么当返回EOF时,到底是文件读取完毕了还是读取出错了?我们可以借助 stdio.h 中的两个函数来判断,分别是 feof() 和 ferror()。

    feof() 函数用来判断文件内部指针是否指向了文件末尾,它的原型是:

    int feof ( FILE * fp );

    当指向文件末尾时返回非零值,否则返回零值。

    ferror() 函数用来判断文件操作是否出错,它的原型是:

    int ferror ( FILE *fp );

    出错时返回非零值,否则返回零值。

    需要说明的是,文件出错是非常少见的情况,上面的示例基本能够保证将文件内的数据读取完毕。如果追求完美,也可以加上判断并给出提示:

    
     
    1. #include<stdio.h>
    2. int main(){
    3. FILE *fp;
    4. char ch;
    5.  
    6. //如果文件不存在,给出提示并退出
    7. if( (fp=fopen("D:\\demo.txt","rt")) == NULL ){
    8. printf("Cannot open file, press any key to exit!");
    9. getch();
    10. exit(1);
    11. }
    12.  
    13. //每次读取一个字节,直到读取完毕
    14. while( (ch=fgetc(fp)) != EOF ){
    15. putchar(ch);
    16. }
    17. putchar('\n'); //输出换行符
    18.  
    19. if(ferror(fp)){
    20. puts("读取出错");
    21. }else{
    22. puts("读取成功");
    23. }
    24.  
    25. fclose(fp);
    26. return 0;
    27. }

    这样,不管是出错还是正常读取,都能够做到心中有数。

    字符写入函数fputc

    fputc 是 file output char 的所以,意思是向指定的文件中写入一个字符。调用的形式为:

    int fputc ( int ch, FILE *fp );

    ch 为要写入的字符,fp 为文件指针。fputc() 写入成功时返回写入的字符,失败时返回EOF,返回值类型为 int 也是为了容纳这个负数。例如:

    fputc('a', fp);

    或者:

    char ch = 'a';
    fputc(ch, fp);

    表示把字符 'a' 写入fp所指向的文件中。

    两点说明

    1) 被写入的文件可以用写、读写、追加方式打开,用写或读写方式打开一个已存在的文件时将清除原有的文件内容,并将写入的字符放在文件开头。如需保留原有文件内容,并把写入的字符放在文件末尾,就必须以追加方式打开文件。不管以何种方式打开,被写入的文件若不存在时则创建该文件。

    2) 每写入一个字符,文件内部位置指针向后移动一个字节。

    【示例】从键盘输入一行字符,写入文件。

    
     
    1. #include<stdio.h>
    2. int main(){
    3. FILE *fp;
    4. char ch;
    5.  
    6. //判断文件是否成功打开
    7. if( (fp=fopen("D:\\demo.txt","wt+")) == NULL ){
    8. printf("Cannot open file, press any key to exit!\n");
    9. getch();
    10. exit(1);
    11. }
    12.  
    13. printf("Input a string:\n");
    14. //每次从键盘读取一个字符并写入文件
    15. while ( (ch=getchar()) != '\n' ){
    16. fputc(ch,fp);
    17. }
    18. fclose(fp);
    19. return 0;
    20. }

    运行程序,输入一行字符并按回车键结束,打开D盘下的demo.txt文件,就可以看到刚才输入的内容。

    程序每次从键盘读取一个字符并写入文件,直到按下回车键,while 条件不成立,结束读取。

    fgetc() 和 fputc() 函数每次只能读写一个字符,速度较慢;实际开发中往往是每次读写一个字符串或者一个数据块,这样能明显提高效率。

    读字符串函数fgets

    fgets() 函数用来从指定的文件中读取一个字符串,并保存到字符数组中,它的原型为:

    char *fgets ( char *str, int n, FILE *fp );

    str 为字符数组,n 为要读取的字符数目,fp 为文件指针。

    返回值:读取成功时返回字符数组首地址,也即 str;读取失败时返回 NULL;如果开始读取时文件内部指针已经指向了文件末尾,那么将读取不到任何字符,也返回 NULL。

    注意,读取到的字符串会在末尾自动添加 '\0',n 个字符也包括 '\0'。也就是说,实际只读取到了 n-1 个字符,如果希望读取 100 个字符,n 的值应该为 101。例如:

    
     
    1. #define N 101
    2. char str[N];
    3. FILE *fp = fopen("D:\\demo.txt", "r");
    4. fgets(str, N, fp);

    表示从 D:\\demo.txt 中读取100个字符,并保存到字符数组str中。

    需要重点说明的是,在读取到 n-1 个字符之前如果出现了换行,或者读到了文件末尾,则读取结束。这就意味着,不管n的值多大,fgets() 最多只能读取一行数据,不能跨行。在C语言中,没有按行读取文件的函数,我们可以借助 fgets(),将n的值设置地足够大,每次就可以读取到一行数据。

    【示例】一行一行地读取文件。

    
     
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #define N 100
    4. int main(){
    5. FILE *fp;
    6. char str[N+1];
    7. if( (fp=fopen("d:\\demo.txt","rt")) == NULL ){
    8. printf("Cannot open file, press any key to exit!\n");
    9. getch();
    10. exit(1);
    11. }
    12.  
    13. while(fgets(str, N, fp) != NULL){
    14. printf("%s", str);
    15. }
    16. fclose(fp);
    17. system("pause");
    18. return 0;
    19. }

    将下面的内容复制到 D:\\demo.txt:

    C语言中文网
    http://c.biancheng.net
    一个学习编程的好网站!

    那么运行结果为:


    fgets() 遇到换行时,会将换行符一并读取到当前字符串。该示例的输出结果之所以和 demo.txt 保持一致,该换行的地方换行,就是因为 fgets() 能够读取到换行符。而 gets() 不一样,它会忽略换行符。

    写字符串函数fputs

    fputs() 函数用来向指定的文件写入一个字符串,它的原型为:

    int fputs( char *str, FILE *fp );

    str 为要写入的字符串,fp 为文件指针。写入成功返回非负数,失败返回EOF。例如:

    
     
    1. char *str = "http://c.biancheng.net";
    2. FILE *fp = fopen("D:\\demo.txt", "at+");
    3. fputs(str, fp);

    表示把把字符串 str 写入到 D:\\demo.txt 文件中。

    【示例】向上例中建立的 d:\\demo.txt 文件中追加一个字符串。

    
     
    1. #include<stdio.h>
    2. int main(){
    3. FILE *fp;
    4. char str[102] = {0}, strTemp[100];
    5. if( (fp=fopen("D:\\demo.txt", "at+")) == NULL ){
    6. printf("Cannot open file, press any key to exit!\n");
    7. getch();
    8. exit(1);
    9. }
    10. printf("Input a string:");
    11. gets(strTemp);
    12. strcat(str, "\n");
    13. strcat(str, strTemp);
    14. fputs(str, fp);
    15. fclose(fp);
    16. return 0;
    17. }

    运行程序,输入C C++ Java Linux Shell,打开 D:\\demo.txt,文件内容为:

    展开全文
  • C语言数据结构

    2015-09-26 10:06:39
    3)C语言数据类型丰富,具有现代语言的各种数据类型,用户还能扩充它,实现各种复杂的数据结构,完成各种问题的数据描述。 4)C语言是一种结构化程序设计语言,层次清晰,便于按模块化方式组织程序,易于调试和维护。C...
  • 在操作系统中,为了统一对各种硬件操作,简化接口,不同硬件设备也都看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。例如: 通常把显示器称为标准输出文件,printf 就是向这个文件输出数据...

    一、文件

    我们对文件的概念已经非常熟悉,比如常见的 Word 文档、txt 文件、源文件等。文件是数据源的一种,最主要的作用是保存数据。

    在操作系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。例如:

    • 通常把显示器称为标准输出文件,printf 就是向这个文件输出数据;
    • 通常把键盘称为标准输入文件,scanf 就是从这个文件读取数据。
    常见硬件设备所对应的文件
    文件 硬件设备
    stdin 标准输入文件,一般指键盘;scanf()、getchar() 等函数默认从 stdin 获取输入。
    stdout 标准输出文件,一般指显示器;printf()、putchar() 等函数默认向 stdout 输出数据。
    stderr 标准错误文件,一般指显示器;perror() 等函数默认向 stderr 输出数据。
    stdprn 标准打印文件,一般指打印机。

    在C语言中硬件设备可以看成文件,有些输入输出函数不需要你指明到底读写哪个文件,系统已经为它们设置了默认的文件,当然你也可以更改,例如让 printf 向磁盘上的文件输出数据。

    操作文件的正确流程为:打开文件 --> 读写文件 --> 关闭文件。文件在进行读写操作之前要先打开,使用完毕要关闭。

    所谓打开文件,就是获取文件的有关信息,例如文件名、文件状态、当前读写位置等,这些信息会被保存到一个 FILE 类型的结构体变量中。关闭文件就是断开与文件之间的联系,释放结构体变量,同时禁止再对该文件进行操作。

    在C语言中,文件有多种读写方式,可以一个字符一个字符地读取,也可以读取一整行,还可以读取若干个字节。文件的读写位置也非常灵活,可以从文件开头读取,也可以从中间位置读取。


    二、文件流

    所有的文件(保存在磁盘)都要载入内存才能处理,所有的数据必须写入文件(磁盘)才不会丢失。数据在文件和内存之间传递的过程叫做文件流,类似水从一个地方流动到另一个地方。数据从文件复制到内存的过程叫做输入流,从内存保存到文件的过程叫做输出流。

    文件是数据源的一种,除了文件,还有数据库、网络、键盘等;数据传递到内存也就是保存到C语言的变量(例如整数、字符串、数组、缓冲区等)。我们把数据在数据源和程序(内存)之间传递的过程叫做数据流(Data Stream)。相应的,数据从数据源到程序(内存)的过程叫做输入流(Input Stream),从程序(内存)到数据源的过程叫做输出流(Output Stream)

    输入输出(Input output,IO)是指程序(内存)与外部设备(键盘、显示器、磁盘、其他计算机等)进行交互的操作。几乎所有的程序都有输入与输出操作,如从键盘上读取数据,从本地或网络上的文件读取数据或写入数据等。通过输入和输出操作可以从外界接收信息,或者是把信息传递给外界。

    我们可以说,打开文件就是打开了一个流。


    三、文本文件和二进制文件

    从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。

    ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为:

    ASC码:  00110101 00110110 00110111 00111000
          ↓     ↓     ↓       ↓
    十进制码: 5     6      7     8 

    共占用4个字节。ASCII码文件可在屏幕上按字符显示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。 由于是按字符显示,因此能读懂文件内容。

    二进制文件是按二进制的编码方式来存放文件的。

    例如, 数5678的存储形式为: 00010110 00101110只占二个字节。二进制文件虽然也可在屏幕上显示, 但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。 输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。

    因此也把这种文件称作“流式文件”。

    一个文件可以以文本模式或二进制模式打开,这两种的区别是:在文本模式中回车被当成一个字符'/n',而二进制模式认为它是两个字符0x0D,0x0A;如果在文件中读到0x1B,文本模式会认为这是文件结束符,也就是二进制模型不会对文件进行处理,而文本方式会按一定的方式对数据作相应的转换。

    展开全文
  • C语言的文件操作

    2019-06-27 00:33:20
    一、磁盘上文件是文件,在程序设计中,我们一般谈到两种文件: 1.程序文件:包括源程序文件(后缀为.c),目标文件(windows环境后缀为....根据数据组织形式, 数据文件被称为被称为 文本文件 或者 二进制文...
  • 1.什么是文件 (1)程序文件:程序源文件(后缀为.c)目标文件(后缀文件为.obj)、可执行文件(后缀为.exe)等。这种文件时程序代码 (2)数据文件:是供程序运行时读写的数据 ...ASCII文件被称为文本文件 ...
  • c语言的文件操作

    2019-08-28 19:35:06
    但是在程序设计中,我们一般谈文件有两种:程序文件、数据文件 文件名 一个文件要有一个唯一文件标识,以便用户识别和引用。 文件名包含3部分:文件路径+文件名主干+文件后缀 例如: c:\code\test.txt 为了方便...
  • C语言文件的操作

    2020-04-19 23:42:07
    一:简介 (1)程序文件与数据文件 ***程序文件:***包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境...根据数据组织形式,数据文件被称为文本文件或者二进制文件。 数据在...
  • 在操作系统中,为了统一对各种硬件操作,简化接口,不同硬件设备也都看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。例如: 通常把显示器称为标准输出文件,printf 就是向这个文件输出数据...
  • C语言文件操作

    2019-07-01 23:19:49
    根据数据的组织形式,数据文件被称为文本文件或者二进制文件; 文件缓冲区 ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓...
  • 文件存放的数据的组织形式可以是文本文件或二进制,分别称为文本文件和二进制文件。 2.打开和关闭文件 FILE *fopen(const char *filename,const char *mode); 返回值:指向打开文件的指针,后续的读写和关闭文件...
  • C语言读写文件

    2017-08-12 21:11:32
    C-File I/O  文件的I/O操作是每一门语言...因此,这种字节流便被称为流(stream)。程序只需要关心创建正确输出字节数据,以及正确地解释从输入读取字节数据。特定I/O设备细节对程序员是隐藏。绝大多数流是完
  • C语言文件概述

    千次阅读 2018-11-29 10:40:06
    C语言文件概述 ...例如,通常把显示器称为标准输出文件,printf就是向这个文件输出,把键盘称为标准输入文件,scanf就是从这个文件获取数据。 常见硬件设备与文件的对应关系 文件 ...
  • 在操作系统中,为了统一对各种硬件操作,简化接口,不同硬件设备也都看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。例如: 通常把显示器称为标准输出文件,printf 就是向这个文件输出数据;...
  • c语言输出CSV文件

    千次阅读 2018-07-29 16:26:52
    先来看看百度百科的解释吧1 ...纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是...
  • C语言 文件操作

    2021-01-17 16:21:14
    数据文件被称为文本文件或者二进制文件。 二进制文件:数据在内存中以二进制形式存储,如果不加转换输出到外存。 文本文件:如果要求在外存上以ASCII码形式存储,则需要在存储前转换。以ASCII字符形式存储...
  • C语言文件操作详解

    2021-03-20 16:33:06
    C语言文件操作详解 ...其中数据文件根据数据组织形式,数据文件被称为文本文件或者二进制文件。 文本文件是指以ASCII字符形式存储文件就是文本文件。 而二进制文件则指数据在内存中以二进制形式存
  • 在操作系统中,为了统一对各种硬件操作,简化接口,不同硬件设备也都看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。例如: 通常把显示器称为标准输出文件,printf 就是向这个文件输出数据...
  • C语言 关于文件操作

    2020-12-02 23:10:32
    ·我们可以使用文件将数据直接存放在电脑硬盘上,从而做到数据持久化。 ·磁盘上文件是文件。 ·在程序设计中,文件从功能角度...·文件类型根据数据组织形式,数据文件被称为 文本文件 或 二进制文件..
  • 在程序设计中,文件分为程序文件和数据文件,其中数据文件被称为二进制文件和文本文件. 直观上来说二进制文件就是看不懂文件(以二进制形式进行存储);文本文件就是以ASCII字符形式存储. 在读写文件之前我们...
  • c语言文件操作

    2019-08-28 18:11:34
    数据文件:文件袋内容不一定是程序,而是程序运行是读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。 文件名 文件名包含三个部分:文件路径+文件名主干+文件后缀 eg:c:\code\test,txt 为了...
  • C语言文件操作

    千次阅读 2020-05-10 10:52:28
    数据文件被称为文本文件或者二进制文件。数据在内存中以二进制形式存储,如果不加转换输出到外存,就是二进制文件。 注意 字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储
  • C语言文件操作

    2019-04-06 22:50:11
    在操作系统中,为了统一对各种硬件操作,简化接口,不同硬件设备也都看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。例如: 通常把显示器称为标准输出文件,printf 就是向这个文件输出数据;...
  • C语言中,将在不同的输入/输出设备之间进行传递的数据抽象为“流”。 当一段程序中调用scanf()函数时,会有数据经过键盘流入存储器,当调用printf()函数,会有数据从存储器流向屏幕。 流实际上就是一个字节...
  • C语言中每个串行输入源和输出目标被称为流。输入流是一个串行数据源,可以为程序提供数据,即在输入操作中,字节从输入设备流向内存。而输出流是串行数据的目的地,可以接收程序输出,即在输出操作中,字节从...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 200
精华内容 80
关键字:

c语言的数据文件被称为

c语言 订阅