精华内容
下载资源
问答
  • 2020-10-12 08:57:53

    首先参考该文

    1、fopen,fclose函数举例

    FILE* fi = NULL;    //指针初始化
    FILE* fi = fopen();    //指针赋值
    if(fi)
    {
        fread(fi);
        //do sth.    //指针使用前需要进行判断是否为空
    }
     
     
     
    if(fi)
        {
     fclose();
     fi = NULL;  //对变量进行复位是个好习惯 
    }
    

    2、open,close函数举例

    int fd = -1;    //文件描述符初始化
    fd = open();    //文件描述符赋值
    if(fd!=-1)
    {
        read(fd);
        //do sth.    //文件描述符使用前需要进行判断是否赋值成功
    }
     
    if(fd!=-1)
    {
         close();
         fd = -1;  //文件描述符在调用close函数后重新置-1,否则关闭的时候没法判断是否是打开的。
    }
    

     由上述两个例子可以看出,在关闭的时候,需要对文件指针和文件描述符进行复位操作。因为,需要通过文件指针的值和文件描述符的值进行判断,是否打开了,这一点一定要记住。

    更多相关内容
  • 在用Delphi 编程处理文本文件的时候,如果要装载的文件比较大,你可能会想在文件装载过程中提供一个装载进度的提示--那么你就必需自己编写直接通过文件打开/读取函数来装载文件内容的函数
  • Python open()函数详解:打开指定文件

    千次阅读 2022-04-06 12:11:45
    Python open()函数详解:打开指定文件 在 Python 中,如果想要操作文件,首先需要创建或者打开指定的文件,并创建一个文件对象,而这些工作可以通过内置的 open() 函数实现。 open() 函数用于创建或打开指定文件,该...

    Python open()函数详解:打开指定文件

    在 Python 中,如果想要操作文件,首先需要创建或者打开指定的文件,并创建一个文件对象,而这些工作可以通过内置的 open() 函数实现。

    open() 函数用于创建或打开指定文件,该函数的常用语法格式如下:

    file = open(file_name [, mode='r' [ , buffering=-1 [ , encoding = None ]]])
    

    此格式中,用 [] 括起来的部分为可选参数,即可以使用也可以省略。其中,各个参数所代表的含义如下:

    file:表示要创建的文件对象。

    file_name:要创建或打开文件的文件名称,该名称要用引号(单引号或双引号都可以)括起来。需要注意的是,如果要打开的文件和当前执行的代码文件位于同一目录,则直接写文件名即可;否则,此参数需要指定打开文件所在的完整路径。

    mode:可选参数,用于指定文件的打开模式。可选的打开模式如表 1 所示。如果不写,则默认以只读(r)模式打开文件。

    buffering:可选参数,用于指定对文件做读写操作时,是否使用缓冲区(本节后续会详细介绍)。

    encoding:手动设定打开文件时所使用的编码格式,不同平台的 ecoding 参数值也不同,以 Windows 为例,其默认为 cp936(实际上就是 GBK 编码)。

    open() 函数支持的文件打开模式如表 1 所示。

    表 1 open 函数支持的文件打开模式

    模式意义注意事项
    r只读模式打开文件,读文件内容的指针会放在文件的开头。操作的文件必须存在。
    rb以二进制格式、采用只读模式打开文件,读文件内容的指针位于文件的开头,一般用于非文本文件,如图片文件、音频文件等。
    r+打开文件后,既可以从头读取文件内容,也可以从开头向文件中写入新的内容,写入的新内容会覆盖文件中等长度的原有内容。
    rb+以二进制格式、采用读写模式打开文件,读写文件的指针会放在文件的开头,通常针对非文本文件(如音频文件)。
    w以只写模式打开文件,若该文件存在,打开时会清空文件中原有的内容。若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。
    wb以二进制格式、只写模式打开文件,一般用于非文本文件(如音频文件)
    w+打开文件后,会对原有内容进行清空,并对该文件有读写权限。
    wb+以二进制格式、读写模式打开文件,一般用于非文本文件
    a以追加模式打开一个文件,对文件只有写入权限,如果文件已经存在,文件指针将放在文件的末尾(即新写入内容会位于已有内容之后);反之,则会创建新文件。
    ab以二进制格式打开文件,并采用追加模式,对文件只有写权限。如果该文件已存在,文件指针位于文件末尾(新写入文件会位于已有内容之后);反之,则创建新文件。
    a+以读写模式打开文件;如果文件存在,文件指针放在文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。
    ab+以二进制模式打开文件,并采用追加模式,对文件具有读写权限,如果文件存在,则文件指针位于文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。

    文件打开模式,直接决定了后续可以对文件做哪些操作。例如,使用 r 模式打开的文件,后续编写的代码只能读取文件,而无法修改文件内容。

    图 2 中,将以上几个容易混淆的文件打开模式的功能做了很好的对比:

    不同文件打开模式的功能

    图 2 不同文件打开模式的功能

    【例 1】默认打开 “a.txt” 文件。

    #当前程序文件同目录下没有 a.txt 文件
    file = open("a.txt")
    print(file)
    

    当以默认模式打开文件时,默认使用 r 权限,由于该权限要求打开的文件必须存在,因此运行此代码会报如下错误:

    Traceback (most recent call last):
      File "C:\Users\mengma\Desktop\demo.py", line 1, in <module>
        file = open("a.txt")
    FileNotFoundError: [Errno 2] No such file or directory: 'a.txt'
    

    现在,在程序文件同目录下,手动创建一个 a.txt 文件,并再次运行该程序,其运行结果为:

    <_io.TextIOWrapper name='a.txt' mode='r' encoding='cp936'>
    

    可以看到,当前输出结果中,输出了 file 文件对象的相关信息,包括打开文件的名称、打开模式、打开文件时所使用的编码格式。

    使用 open() 打开文件时,默认采用 GBK 编码。但当要打开的文件不是 GBK 编码格式时,可以在使用 open() 函数时,手动指定打开文件的编码格式,例如:

    file = open("a.txt",encoding="utf-8")
    

    注意,手动修改 encoding 参数的值,仅限于文件以文本的形式打开,也就是说,以二进制格式打开时,不能对 encoding
    参数的值做任何修改,否则程序会抛出 ValueError 异常,如下所示:

    ValueError: binary mode doesn't take an encoding argument
    

    open()是否需要缓冲区

    通常情况下、建议大家在使用 open() 函数时打开缓冲区,即不需要修改 buffing 参数的值。

    如果 buffing 参数的值为 0(或者 False),则表示在打开指定文件时不使用缓冲区;如果 buffing 参数值为大于 1 的整数,该整数用于指定缓冲区的大小(单位是字节);如果 buffing 参数的值为负数,则代表使用默认的缓冲区大小。

    为什么呢?原因很简单,目前为止计算机内存的 I/O 速度仍远远高于计算机外设(例如键盘、鼠标、硬盘等)的 I/O 速度,如果不使用缓冲区,则程序在执行 I/O 操作时,内存和外设就必须进行同步读写操作,也就是说,内存必须等待外设输入(输出)一个字节之后,才能再次输出(输入)一个字节。这意味着,内存中的程序大部分时间都处于等待状态。

    而如果使用缓冲区,则程序在执行输出操作时,会先将所有数据都输出到缓冲区中,然后继续执行其它操作,缓冲区中的数据会有外设自行读取处理;同样,当程序执行输入操作时,会先等外设将数据读入缓冲区中,无需同外设做同步读写操作。

    open()文件对象常用的属性

    成功打开文件之后,可以调用文件对象本身拥有的属性获取当前文件的部分信息,其常见的属性为:

    file.name:返回文件的名称;

    file.mode:返回打开文件时,采用的文件打开模式;

    file.encoding:返回打开文件时使用的编码格式;

    file.closed:判断文件是否己经关闭。

    举个例子:

    # 以默认方式打开文件
    f = open('my_file.txt')
    # 输出文件是否已经关闭
    print(f.closed)
    # 输出访问模式
    print(f.mode)
    #输出编码格式
    print(f.encoding)
    # 输出文件名
    print(f.name)
    

    程序执行结果为:

    False
    r
    cp936
    my_file.txt
    

    注意,使用 open() 函数打开的文件对象,必须手动进行关闭(后续章节会详细讲解),Python
    垃圾回收机制无法自动回收打开文件所占用的资源。

    展开全文
  • 第9.2节 Python的文件打开函数open详解

    千次阅读 2021-02-03 14:57:05
    一、引言在操作一个文件前,大部分情况需要先打开文件,才能进行,在Python中使用内置函数open来打开一个文件。open函数是Python的一个内置函数,io模块 定义的函数open是该内置函数的同义词(这是Python官网中关于io...

    一、引言

    在操作一个文件前,大部分情况需要先打开文件,才能进行,在Python中使用内置函数open来打开一个文件。open函数是Python的一个内置函数,io模块 定义的函数open是该内置函数的同义词(这是Python官网中关于io.open函数的说明,原文如下: “This is an alias for the builtin open() function”。这里的this是指io.open),open函数相关常规的操作方式与C语言的fopen函数类似度比较高。

    二、函数调用语法及参数释义

    1.语法:

    open(file, mode =‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

    2.参数说明:

    open函数的参数老猿认为重要的就是file、mode,这个与c语言的fopen的参数非常类似,其他参数老猿就不展开细说。

    1)file参数:

    Python官网是这样说的:“file 是一个 path-like object,表示将要打开的文件的路径(绝对路径或者当前工作目录的相对路径),也可以是要被封装的整数类型文件描述符。(如果是文件描述符,它会随着返回的 I/O 对象关闭而关闭,除非 closefd 被设为 False 。)”。

    像open()函数返回的这种有个read()方法的对象,在Python中统称为file-like Object。除了file外,还可以是内存的字节流,网络流,自定义流等等。file-like Object不要求从特定类继承,只要写个read()方法就行。例如StringIO就是在内存中创建的file-like Object,常用作临时缓冲

    对初学者来说,理解其为可以带路径的文件名就可以了,注意如果是windows的路径带有反斜杠,需要前面再加反斜杠,防止被Python转义,其实最好的办法就是用原始字符串,即在字符串前面加字母r。

    如果是文件描述符,该文件描述符应是一个通过os.open打开文件返回的文件描述符。关于文件描述符老猿将在后面的文章单独介绍,大家也可以在网上自己查资料。

    2)mode:

    文件打开的读写模式,是一个可选字符串,用于指定打开文件的模 式,默认值是 ‘r’。相关取值及对应模式如下:

    af516b4c12463dc83e98b1068a6e50cf.png

    老猿认为该模式与 C语言中的文件模式很像,主要由两种属性组合而成:

    文件的类型:分为文本文件、二进制文件,对应模式中的:t、b。其中t模式是缺省模式;

    操作的类型:读、写、追加、更新模式,对应模式中的:r、w、a、x、+,分别对应:只读、写、追加写、排它性创建写、更新,其中r模式是缺省模式,w模式在文件存在时会截断文件清空内容将文件重置为长度为0的空文件,不存在时会创建文件,a模式在文件存在时不会清空内容,文件不存在时会创建文件,x模式是新加的模式,当一个文件已经存在时,以x模式打开会引发FileExistsError,文件不存在时会创建文件执行写入。

    注意:以上模式除追加模式外打开文件写入内容时,在没有指定文件内容写入位置的情况下,写入的地方都是从文件开头的位置开始写入,并且在文件已经存在的情况下,写入内容会覆盖文件开头对应长度的内容。追加模式写入都会追加到文件末尾。

    更新模式,实际上就是读写模式,对应模式中的+,在指定了r模式的情况下启用更新模式,则文件内容还可读写,但x模式在文件已经存在的情况下不能使用更新模式。’'r+'和’w+‘之间有个重要差别:后者截断文件,而前者不会这样做。

    默认模式为’rt’,这意味着将把文件视为经过编码的Unicode文本,因此将自动执行解码和编码,且默认使用UTF-8编码。要指定其他编码和Unicode错误处理策略,可使用关键字参数encoding和errors。

    3)buffering:

    是可选参数,用于设置缓冲策略。传递0以关闭缓冲(仅允许在二进制模式下),1选择行缓冲(仅在文本模式下可用),并且>1的整数以指示固定大小的块缓冲区的大小(以字节为单位)。如果没有给出 buffering 参数或值为-1,则默认缓冲策略如下:

    二进制文件以固定大小的块进行缓冲;缓冲区的大小尝试底层设备的“块大小”或使用 io.DEFAULT_BUFFER_SIZE参数定义的大小。在许多系统上,缓冲区的长度通常为4096或8192字节。

    “交互式”文本文件( isatty() 返回 True 的文件)使用行缓冲。其他文本文件使用上述用于二进制文件的策略。

    4)encoding:

    在文本模式,如果 encoding 没有指定,则根据平台环境来决定使用本地编码,本地编码可以通过import locale模块后,使用 locale.getpreferredencoding(False) 来获取。二进制文件不需要设置 encoding参数;

    5)errors:

    是一个可选的字符串参数,用于指定如何处理编码和解码错误,由于二进制文件不能指定编码方式,因此该参数不能在二进制模式下使用。错误类型包括:

    •‘strict’ :如果存在编码错误,会引发 ValueError 异常。 默认值 None 具有相同的效果。

    •‘ignore’: 忽略错误,请注意,忽略编码错误可能会导致数据丢失。

    •‘replace’: 会将替换标记(例如 ‘?’ )插入有错误数据的地方。

    •‘surrogateescape’ :将表示任何不正确的字节作为Unicode专用区中的代码点,范围从U+DC80到U+DCFF。当在写入数据时使用 surrogateescape 错误处理程序时,这些私有代码点将被转回到相同的字节中。这对于处理未知编码的文件很有用。

    •‘xmlcharrefreplace’:只有在写入文件时才支持 ,编码不支持的字符将替换为相应的XML字符引用 nnn;。

    •‘backslashreplace’: 用Python的反向转义序列替换格式错误的数据。

    •‘namereplace’ 在文件写入时用 \N{…} 转义序列替换不支持的字符。

    6)newline:

    换行符,用于 控制识别换行符和换行符读写的转换方式,它仅适用于文本模式,可以是 None、空字符串’’、’\n’、’\r’、 ‘\r\n’以及其他合法的字符串。它的工作原理:

    •官网翻译:“从流中读取输入时,如果 newline 为 None,则启用通用换行模式。输入中的行可以以 ‘\n’,’\r’ 或 ‘\r\n’ 结尾,这些行结尾符被转换成 ‘\n’ 。如果它是 ‘‘或引号标识的一个字符串,则启用通用换行模式,但行结尾将直接返回给访问者。如果它具有任何其他合法值,则输入行仅由给定字符串终止,并且行结尾将返回给给文件访问方”。老猿理解为:

    所有换行符都用来判断一个文本的行是否结束,差别是关于换行符读取后怎么进行转换存入到读入的缓冲中;

    如果换行符是通用换行模式,则’\n’,’\r’ 或 ‘\r\n’都可以作为行 结尾,并且读取行时,这些符号被转换成’\n’读入缓冲中;

    如果该处填空字符串,则读取行的处理同’\n’,’\r’ 或 ‘\r\n’ ,只是’\n’,’\r’ 或 '\r\n’这些换行符不会进行转换,直接原样读入缓冲中。

    •将输出写入文件流时,如果 newline 为 None,则写入的任何 ‘\n’ 字符都将转换为系统默认行分隔符 os.linesep。如果 newline 是 ‘’ 或 ‘\n’,则不进行转换直接写入。如果 newline 是任何其他合法值,则写入的任何 ‘\n’ 字符将被转换为给定的字符串。

    7)closefd:

    这个参数老猿没有深入研究,大致认为是在第一个参数file不是文件名而是一个使用os.open打开的文件描述符时,在此指定当本open函数返回的文件对象关闭后,对应的文件描述符文件是否关闭,如果该参数为True则关闭传入进来的文件描述符,否则不关闭,该参数在第一个参数file为文件名时没有意义;

    这个参数老猿没有完全弄明白作用,老猿猜想有种场景可以使用,就是第一个参数是通过外部接口传入的file是一个文件描述符,此时为了兼容通过文件名访问的功能,因此需要将其转换为文件对象进行操作,需要使用该参数确保传入的文件描述符不会关闭,以便外部接口后续能继续正常运行。

    8)opener:

    这个参数老猿没有深入研究,它是一个可调用的函数,该函数的目的是为了定制自己的文件打开操作函数,且这个文件打开操作函数的参数是open函数的第一个参数file和第二个参数mode,返回值是一个文件描述符(即通过os.open返回的类型),系统默认是调用的就是os.open,所以该参数传os.open与传None是相同的结果。

    老猿没有弄明白这个参数opener的作用,可能在操作者需要深度控制文件访问逻辑时使用。

    三、函数返回结果

    如果文件成功打开, open() 函数所返回的 file object 类型取决于所用模式。 当使用 open() 以文本模式 (‘w’, ‘r’, ‘wt’, ‘rt’ 等) 打开文件时,它将返回 io.TextIOBase 的一个子类 。 当使用缓冲以二进制模式打开文件时,返回的类是 io.BufferedIOBase 的一个子类。 具体的类会有多种:在只读的二进制模式下,它将返回 io.BufferedReader;在写入二进制和追加二进制模式下,它将返回 io.BufferedWriter,而在读/写模式下,它将返回 io.BufferedRandom。 当禁用缓冲时,则会返回原始流,即 io.RawIOBase 的一个子类 io.FileIO。

    如果该文件不能打开,则触发 OSError及相关异常。

    本节详细介绍了Python内置函数open(同时也是io.open的同义词)的相关调用语法及参数,相关参数有些内容老猿也没有完全弄清楚。

    展开全文
  • [C语言]文件操作函数

    2022-02-23 12:17:08
    [C语言]文件操作函数 ​ 本文主要学习**fopen,fclose,fgetc,fgets,fputc,fputs,fwrite,fread,feof**这几个文件操作函数。 ​ 以上函数,需要导入头文件 stdio.h ​ 为什么要学习这些函数?肯定是因为我们...

    [C语言]文件操作函数

    ​ 本文主要学习**fopenfclosefgetcfgetsfputcfputsfwritefreadfeof**这几个文件操作函数。

    ​ 以上函数,需要导入头文件 stdio.h

    ​ 为什么要学习这些函数?肯定是因为我们需要存储我们的数据,使数据放入到硬盘中方便保存。

    ​ 本文中梳理一些最常见的文件操作函数。

    前言:文本文件和二进制文件

    ​ 根据数据的组织形式,数据文件被称为文本文件或者二进制文件

    ​ 数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件

    ​ 如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件

    一.文件的打开与关闭

    文件指针

    ​ 缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。

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

    文件指针的创建

    FILE* pf
    

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

    二. fopenfclose

    fopenfclose一般是成对出现的,有 fopen 就会有 fclose

    fopen是打开文件的函数,fclose是关闭文件的函数

    函数参数介绍

    //打开文件
    FILE * fopen ( const char * filename, const char * mode );
    
    //关闭文件
    fclose ( FILE * stream);
    

    fopen的第一个参数,表示要打开的文件,如果在本目录下,直接书写文件名即可,如果不在本目录,就需要写出文件绝对路径。

    fopen 的第二个参数表示对文件的操作形式,可看下图来学习。

    文件的操作形式

    fclose则是关闭我们打开的文件。

    实例

    ​ 在使用完fopen函数后,最好判断一下, fopen文件函数是否返回空指针NULL

    int main()
    {
    	FILE* pr = fopen("data.txt", "r");//第一个参数是我要打开的文件名,第二个参数代表对文件的操作是“只读”
    	if (NULL == pr)//判断pr是否文件是否打开成功
    	{
    		printf("open for reading : %s", strerror(errno));
    		return 0;
    	}
    
    	FILE* pw = fopen("data2.txt", "w");//第一个参数是我要打开的文件名,第二个参数代表对文件的操作是“写入”
    	if (NULL == pw)//判断文件是否打开成功
    	{
    		printf("open for writing : %s", strerror(errno));
    		fclose(pr);//如果打开此文件失败,则关闭上一个文件。
    		pr = NULL;
    		return 0;
    	}
        fclose(pr);//文件使用完成后,关闭文件
        pr = NULL;//并将文件指针置空
        fclose(pw);
        pw = NULL;
    	return 0}
    

    三. fputcfgetc

    ​ 这两个文件函数在上个案列的代码演示中已经出现, fgetc 是读取文件中的字符, fputc是将字符输出到文件中。

    //fgetc的函数参数
    int fgetc( FILE *stream );//stream代表将要读取字符的文件
    
    //fputc的函数参数
    int fputc( int c, FILE *stream );// c 代表我们将要存入的字符,stream是我们存放 c 的文件。
    

    实例

    ​ 这是结合了上一个实例而成的。

    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    int main()
    {
    	FILE* pr = fopen("data.txt", "r");//第一个参数是我要打开的文件名,第二个参数代表对文件的操作是“只读”
    	if (NULL == pr)//判断pr是否文件是否打开成功
    	{
    		printf("open for reading : %s", strerror(errno));
    		return 0;
    	}
    
    	FILE* pw = fopen("data2.txt", "w");//第一个参数是我要打开的文件名,第二个参数代表对文件的操作是“写入”
    	if (NULL == pw)//判断文件是否打开成功
    	{
    		printf("open for writing : %s", strerror(errno));
    		fclose(pr);//如果打开此文件失败,则关闭上一个文件。
    		pr = NULL;
    		return 0;
    	}
    	int ch = 0;
    	while ((ch = fgetc(pr)) != EOF)//将“data.txt”文件的所有所有内容都写进“data2.txt”这个文件
    	{
    		fputc(ch, pw);
    	}
    	return 0;
    }
    

    四. fgetsfputs

    fgets 是读取文件中数据的一行,相反,fputs则是输出一行到文件。

    函数参数介绍

    //fgets的函数参数
    char *fgets( char *string, int n, FILE *stream );//第一个参数是我们接收文件中数据的字符串,第二个参数 n 表示我们要读取几个字符,不过字符数是 (n-1)个字符,第三个参数则是我们要读取的文件。
    
    //fputs的函数参数
    int fputs( const char *string, FILE *stream );//这个函数的参数实际和fgetc差不多,不过这里输出的是字符串到文件stream中,而不是一个字符。
    

    实例

    ​ 将数据输入到文件中,再次提醒,如果文件不在本目录下,需要加上绝对路径

    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
    int main()
    {
    	FILE* pf = fopen("data.txt", "w");
    	if (NULL == pf)
    	{
    		printf("open for write : %s", strerror(errno));
    		return 0;
    	}
    	fputs("hello world\n", pf);
    	fputs("haha\n", pf);
    
    	fclose(pf);
    	pf = NULL;
    	return 0;
    }
    
    image-20220223112734927 image-20220223112813013

    读取文件

    int main()
    {
    	FILE* pf = fopen("data.txt", "r");
    	if (NULL == pf)
    	{
    		printf("open for write : %s", strerror(errno));
    		return 0;
    	}
    	char arr[2] = { 0 };//开辟两个空间来接收数据
    	fgets(arr, 13, pf);// fgets只能读取(n-1)个字符,所以是13
    	printf("%s", arr); 
    
    	fgets(arr+1, 5 , pf);
    	printf("%s", arr+1);
    
    
    	fclose(pf);
    	pf = NULL;
    	return 0;
    }
    

    image-20220223113227451

    五.fwritefread

    fwrite是二进制输出,也就是说,将内容以二进制的形式进行输出到文件中保存。

    fread则是读取文件的以二进制保存的数据。

    函数参数介绍

    //fwrite函数参数
    size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );//第一个参数buffer表示我们要输出的数据的地址,第二参数size是我们要输出的数据大小,第三个参数是count是我们要输入的数据个数,第四个参数则是我们要将数据输入到的文件。
    
    //fread函数参数
    size_t fread( void *buffer, size_t size, size_t count, FILE *stream );//第一个参数buffer表示我们要接收的数据的地址,第二参数size是我们要接收的数据大小,第三个参数是count是我们要接收的数据个数,第四个参数则是我们要将数据输入到的buffer的文件。
    

    实例

    fwrite 二进制输出

    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    struct Stu
    {
    	int age;
    	char name[10];
    	char id[20];
    };
    int main()
    {
    	struct Stu s[2] = { { 12, "zhangsan", "253534123" }, {13,"lisi","342342354"}};
    	FILE* pr = fopen("date.txt", "wb");//wb表示:为了输出数据,打开一个二进制文件
    	if (NULL == pr)
    	{
    		printf("open for writing : %s", strerror(errno));
    	}
    	fwrite(&s, sizeof(struct Stu), 2, pr);
    
    	fclose(pr);
    	pr = NULL;
    	return 0;
    }
    

    运行后:

    image-20220223115053326

    image-20220223115458649

    使用 fread 读取date.txt中的数据

    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    struct Stu
    {
    	int age;
    	char name[10];
    	char id[20];
    };
    int main()
    {
    	struct Stu s[2] = { 0 };//开辟两个相同的结构体数组来接收数据
    	FILE* pr = fopen("date.txt", "rb");
    	if (NULL == pr)
    	{
    		printf("open for writing : %s", strerror(errno));
    	}
    	fread(s, sizeof(struct Stu), 2, pr);
    
    	printf("%s %d %s\n", s[0].name, s[0].age, s[0].id);
    	printf("%s %d %s\n", s[1].name, s[1].age, s[1].id);
    
    
    	fclose(pr);
    	pr = NULL;
    
    	return 0;
    }
    

    image-20220223115856782

    ​ 文件读取成功

    六.feof

    应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束

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

    例如:
    

    fgetc 判断是否为 EOF .

    fgets 判断返回值是否为 NULL .

    2.二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

    ​ 例如:

    fread判断返回值是否小于实际要读的个数。

    实例

    文本文件的例子

    #include <stdio.h>
    #include <stdlib.h>
    int main(void) {
        int c; // 注意:int,非char,要求处理EOF
        FILE* fp = fopen("test.txt", "r");
        if(!fp) {
            perror("File opening failed");
            return EXIT_FAILURE;
       }
     //fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
        while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环
       { 
           putchar(c);
       }
        //判断是什么原因结束的
        if (ferror(fp))
            puts("I/O error when reading");
        else if (feof(fp))
            puts("End of file reached successfully");
        fclose(fp);
    }
    

    二进制文件的例子

    #include <stdio.h>
    enum { SIZE = 5 };
    int main(void) {
        double a[SIZE] = {1.,2.,3.,4.,5.};
        FILE *fp = fopen("test.bin", "wb"); // 必须用二进制模式
        fwrite(a, sizeof *a, SIZE, fp); // 写 double 的数组
        fclose(fp);
        double b[SIZE];
        fp = fopen("test.bin","rb");
        size_t ret_code = fread(b, sizeof *b, SIZE, fp); // 读 double 的数组
        if(ret_code == SIZE) {
            puts("Array read successfully, contents: ");
            for(int n = 0; n < SIZE; ++n) printf("%f ", b[n]);
            putchar('\n');
       } else { // error handling
           if (feof(fp))
              printf("Error reading test.bin: unexpected end of file\n");
           else if (ferror(fp)) {
               perror("Error reading test.bin");
           }
       }
        fclose(fp);
    }
    
    展开全文
  • 如果直接用 open() 函数打开一个不存在的文件时,程序会抛出异常,我们可以通过 try 语句来捕获异常以达到判断文件是否存在的目的。 如果文件不存在,open() 函数会抛出 FileNotFoundError 异常。如果文件无操作权限...
  • 在C语言中,操作文件之前必须先打开文件;所谓“打开文件”,就是让程序和文件建立连接的过程。 打开文件之后,程序可以得到文件的相关信息,例如大小、类型、权限、... 头文件中的 fopen() 函数即可打开文件,它的用法
  • 检查当前是否打开了特定的 excel 文件,如果是,则将其最大化以通知用户。 这个简单的函数可以在更复杂的函数中使用,以检查当前正在运行的 excel 工作簿,如果它们没有做某事,反之亦然。
  • 判断是否打开函数如下: public bool IsFileOpened(string file) { bool result = false; try { FileStream fs = File.OpenWrite(file); fs.Close(); } catch (Exception e) { result = true; } return result; } ...
  • 文件操作及常见文件操作函数使用

    千次阅读 多人点赞 2021-03-14 16:08:16
    文件打开和关闭(1).文件指针(2).文件打开和关闭三.文件的顺序读写四.文件的随机读写五.文件读取结束的判定 一.什么是文件 磁盘上的文件文件。 但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件 ...
  • 判断题】在函数内部,既可以使用 global 来声明使用外部全局变量,也可以使用global 直接定义全局变量。【单选题】4 、等比级数 的和为( )【填空题】7 、设 、 是二阶常系数线性微分方程 的两个线性无关的解,则它的...
  • C语言中如何判断文件是否存在

    千次阅读 2021-05-08 22:49:24
    C语言中如何判断文件是否存在方法一:access函数判断文件夹或者文件是否存在函数原型: int access(const char *filename, int mode);所属头文件:io.hfilename:可以填写文件夹路径或者文件路径mode:0 (F_OK) 只...
  • 常见文件操作函数

    2022-01-05 09:34:55
    介绍进行文件操作时的顺序操作函数(fgetc、fputs、fread、fwrite等),随机读写函数(fseek、ftell、frewind)以及文件缓冲区等……
  • c语言 文件函数

    2021-11-07 10:35:29
    1.fopen():文件打开操作 头文件:stdio.h 函数定义:FILE *fopen(char *pname,char *mode) 函数说明:pname是文件名,mode是打开文件的方式 文件打开方式 含义 如果该文件不存在 “r”(只读) 为了输入数据,打开一...
  • C语言判断文件或文件夹是否存在

    千次阅读 2022-02-09 10:22:50
    汇总网上搜集的资料,总结了下述几种方法用于判断文件或者文件夹是否存在,注意每个函数的头文件引用。
  • 方法一:access函数判断文件夹或者文件是否存在 函数原型:int access(const char *filename, int mode); 所属头文件:windows下 io.h , Linux unistd.h filename:可以填写文件夹路径或者文件路径 mode 说明 ...
  • C语言-概念-判断文件结束函数feof

    千次阅读 2020-05-14 23:09:39
    判断文件结束函数feof 例C语言-概念-调用getc(fgetc)和putc(fputc)函数进行输入和输出中,程序从一个磁盘文件中逐个读取字符并输出到屏幕上显示,在while循环中以EOF作为文件结束的标志。这种以EOF作为文件结束...
  • 函数打开文件。fopen()函数的调用方式一般为: FILE *fp; fp=fopen(文件名,使用文件方式); 使用文件方式见下表: 使用文件方式 含义 “r”(只读) 为输入打开一个文本文件 “w
  • C语言文件读写-判断文件是否结束 在读文件的时候,很重要的一个条件是:文件是否结束,因为文件已经结束了,就不用继续读文件了。 判断文件结束,有许多方式,比如读取文本文件和二进制文件就可以使用不同的方式,...
  • r : 只读方式打开文件 , 文件必须存在 ; 文件不存在打开失败 ; + : 读写方式打开文件 ; w : 打开只写文件 , 文件不存在创建文件 , 文件存在覆盖文件 ; a : 打开只写文件 , 文件不存在创建文件 , 文件存在追加文件...
  •   因为.eof()的机制,按照...只有当再往下读取时,发现文件已经到结尾了,才会将标志eofbit修改为true 所以当刚创建fstream file时,就判断file.eof()的话,一定为false 在file.eof()前加file.peek(); peek函...
  • 判断题】max函数max____可以接收任意多个参数,并返回最大的那个。【单选题】以下四个人工智能的应用领域中,与其他三个不同的是:【单选题】( )函数是指直接或间接调用函数本身的函数【简答题】简述计算机的几大应用...
  • 打开文件open()函数的使用方法详解

    万次阅读 2017-12-22 22:38:35
    头文件:#include #include #include 定义函数:  int open(const char * pathname, int flags);  int open(const char * pathname, int flags, mode_t mode);...参数 pathname 指向欲打开文件路径字符串. 下
  • 注意:以下介绍的函数的功能不是判断文件操作函数是否调用失败,而是在文件操作函数已经调用失败的情况下,判断文件操作函数调用失败的原因。 ferror函数 int ferror( FILE *stream ); ferror函数的功能就是判断...
  • Python open函数打开文件路径

    万次阅读 多人点赞 2018-09-06 14:27:24
    要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符,标示符'r'表示读。   &gt;&gt;&gt; f = open('D:/test.txt','r')   注意了,对初学python的同学而言,open...
  • python之判断是否是目录或文件

    千次阅读 2020-11-20 21:31:44
    在python中我们判断是否是目录还是文件函数 os path. isdir 、os. path .isfile该函数作用就是判断是否是目录、判断是否文件。1.打开pycharm新建一python文件:代码如下:import osprint(os.path.isdir('F:\...
  • 在 Python中,如果想要操作文件,首先需要创建或者打开指定的文件,并创建一个文件对象,而这些工作可以通过内置的 open() 函数实现。 open() 函数用于创建或打开指定文件,该函数的常用语法格式如下: file = open...
  • 文件的读取,c语言打开文件并输出

    千次阅读 2021-05-24 02:04:54
    文件的读取,c语言打开文件并输出在做数据分析的过程中,经常会遇到文件的读取。我想很多人都在这个环节遇到过问题,所以就把自己掌握的一些文件读取方法记录下来,以及过程中遇到的一些状况和解决方法列出来,以便...
  • 最近做一个课题,要求winform...通过查找资料发现C#本身是很难判断一个文件是否打开的,相关资料给出需用到windowsAPI来实现,这种方法按理说是可以的,但也许是我没有完全领会到相关函数的意义和返回值,致使不能判

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 362,946
精华内容 145,178
关键字:

判断是否打开文件流的函数