【C】【笔记】《C和指针》第15章 输入/输出函数

本文为个人读书笔记,仅供记录学习过程中遇到的日后需要留意的问题,如有相关版权问题请及时通知作者。

错误报告
     标准库函数在一个外部整形变量errno(在errno.h中定义)保存错误代码之后把这个信息传递给用户程序,提示操作失败的准确原因。
     perror函数简化向用户报告这些特定错误的过程。它的原型定义与stdio.h
          void perror(char const *message);
     只有当一个库函数失败时,errno才会被设置。当函数成功运行,errno的值不会被修改。这意味着不能通过测试errno的值来判断是否有错误发生。反之,只有当被调用的函数提示有错误发生时检查errno的值才有意义。

终止执行
     exit,用于终止一个程序的执行。它的原型定义于stdlib.h
          void exit(int status);
     status参数返回给操作系统,用于提示程序是否正常完成。这个值和main函数返回的整型状态值相同。预定义符号EXIT_SUCCESS和EXIT_FAILURE分别提示程序的终止时成功还是失败。
     这个函数没有返回值。

ANSI I/O概念
     stdio.h包含了与ANSI函数库的I/O部分有关的声明

     ANSI C进一步对I/O的概念进行了抽象。就C程序而言,所有的I/O操作指示简单的从程序移进或移出。这种字节流被称为 流 stream。程序只需要关心创建正确的输出字节数据,以及正确地解释从输入读取的字节数据。特定I/O设备的细节对程序员是隐藏。
     绝大多数流是完全缓冲的 fully buffered,这意味着读取和写入实际上是从一块被称为缓冲区 buffer的内存区域来回赋值数据。从内存中来回复制数据是非常快速的。用于输出流的缓冲区只有当它写满时才会被刷新(flush,物理写入)到设备或文件中。一次性把写满的缓冲区写入和逐片把程序产生的输出分别写入相比效率更高。类似,输入缓冲区当它为空时通过从设备或文件读取下一块较大的输入,重新填充缓冲区。
     使用标准输入和输出时,这种缓冲可能会引起混淆。所以,只有当操作系统可以断定它们与交互设备并无联系时才会进行完全缓冲。否则,它们的缓冲状态将因编译器而异。
     尽管这种缓冲通常是我们所需的,担当调试程序时可能引起混淆。一个常见的调试策略是把一些printf函数的调用散步于程序中,确定错误出现的具体位置。但是,这些函数调用的输出结果被写入到缓冲区中,并不立即显示于屏幕上。如果程序失败,换出输出可能不会被实际写入,这就可能使程序员得到关于错误出现位置的不正确结论。这个问题的解决方法就是在每个用于调试的printf函数之后立即调用fflush
          printf(“something or other ”);
          fflush(stdout);

流分为两种类型,文本text流和二进制binary流。文本刘的有些特性在不同的系统中可能不同。二进制流中的字节将完全根据程序编写他们的形式写入到文件或设备中,而且完全根据它们从文件或设备读取的形式读入到程序中。它们并未做任何改变。这种类型的流适用于非文本数据,但是如果你不希望I/O函数修改文本文件的末字符,也可以把它用于文本文件。

文件
     stdio.h所包含的声明之一就是FILE结果。FILE区别于磁盘上的数据文件,是一个数据结构,用于访问一个流。如果同时激活了多个流,每个流都有一个相应的FILE与它关联。为了在流上执行一些操作,调用一些合适的函数,并向他们传递一个与这个流关联的FILE参数。
     对于每个ANSI C程序,运行时系统必须提供至少三个流——标准输入standard input、标准输出 standard output、和标准错误 standard error。这些流的名字分别为stdin、stdout、和stderr,他们都是一个指向FILE结构的指针。标准输入是缺省情况下输入的来源,标准输出是缺省的输出设置。
     标准错误就是错误信息写入的地方。perror函数把它的输出也写到这个地方。在许多系统中,标准输出和标准错误在缺省情况下是相同。但是,为错误信息准备一个不同的流意味着,即使标准输出重定向到其他地方,错误信息仍将出现在屏幕或其他缺省的输出设备上。

标准I/O常量 定义于stdio.h
     EOF 提示到达了文件尾
     FOPEN_MAX同时打开文件的最大数量

 流I/O总览。
1、程序为必须同时处于活动状态的每个文件声明一个指针变量,其类型为FILE *。这个指针指向这个FILE结构,当它处于活动状态时由流使用。
2、流通过调用fopen函数打开。为了打开一个流,必须制定需要访问的文件或设备以及他们的访问方式。fopen和操作系统验证文件或设备确实存在并初始化FILE结构
3、根据需要进行读写
4、调用fclose函数关闭流。关闭一个六可以防止与它相关联的文件被再次访问,保证任何存储于缓冲区的数据被正确的小写入到文件中,并且释放FILE结构使它可以用于另外的文件。
标准流不需要打开或关闭。

I/O函数以三种基本的形式处理数据:单个字符、文本行和二进制数据,对于每种形式,都有一组特定的函数对他们进行处理。
执行字符、文本行和二进制I/O的函数
数据类型 输入 输出 描述
字符 getchar putchar 读取单个字符
文本行
gets
scanf
puts
printf
问本行未格式化的输入输出,格式化的输入输出
二进制数据 fread fwrite 读取二进制数据
这些函数的区别在于获得输入的来源或写入的地方不同。这些变种用于执行以下任务:只用于stdin或stdout,随作为参数的流使用,使用内存中的字符串而不是流。

输入/输出函数
家族名 目的 可用于所有的流 只用于stdin和stdout 内存中的字符串
getchar 字符输入 fgetc,getc getchar 1
putchar  字符输出 fputc,putc putchar 1
gets 文本行输入 fgets gets 2
puts 文本行输出 fputs puts 2
scanf 格式化输入 fscanf scanf sscanf
printf 格式化输出 fprintf printf sprintf


打开流
     fopen函数打开一个特定的文件,并把一个流和这个文件相关联。
          File *fopen(char const *name,char const *mode);
     name:要打开的文件或设备。创建文件名的规则在不同的系统中可能各不相同,所以fope把文件名作为一个字符串而不是作为路径名、驱动器字母、文件扩展名等各准备一个参数。这个参数指定要打开的文件——FILE *变量的名字是程序用来保存fopen的返回值的,它并不影响哪个文件被打开。mode(模式)参数提示流是用于只读、只写还是既读又写,以及它是文本流还是二进制流。

  读取 写入 添加
文本 “r” “w” “a”
二进制 “rb” “wb” “ab”
     mode 以r、w或a开头,分别表示打开的流用于读取、写入还是添加。如果一个文件打开是用于读取的,那么它必须是原先已经存在的。入股一个文件打开时用于写入的,如果它原先已经存在,那么它原来的内容就会被删除。如果它原先不存在,那么就创建一个新文件。如果一个打开用于添加的文件原先并不存在,那么它将被创建。如果它原先已经存在,它原先的内容并不会被删除。无论在哪一种情况下,数据只能从文件的尾部写入。
     在mode中添加a+表示该文件打开用于更新,并且流既允许读也允许写。但是,如果已经从该文件读入了一些数据,那么在开始向它写入数据之前,必须调用其中一个文件定位函数(fseek、fsetpos、rewind)。在向文件写入一些数据之后,如果又想从该文件读取一些数据,必须调用fflush函数或者文件定位函数之一。
     如果fopen函数执行成功,它会返回一个指向FILE结构的指针,该结构代表这个新创建的流。如果函数执行失败,它就返回一个NULL指针,errno会提示问题的性质。

关闭流
     fclose关闭流。
          int fclose(FILE *f);
     对于输出流,fclose函数在文件关闭之前刷新缓冲区。如果它执行成功,fclose返回零值,否则返EOF

字符I/O
     字符输入是由getchar函数家族执行的。
          int fgetc(FILE * stream);
          int getc(FILE *Stream);
          int getchar(void);
     需要操作的流作为参数传递给getc和fgetc,但getchar始终从标准输入读取。每个函数从流中读取下一个字符,并把它作为函数的返回值返回。如果流中不存在更多的字符,函数就返回常量值EOF。
     这些函数都返回int型,为了EOF
     字符写入到流中使用putchar函数家族
          int fputc(int character,FILE *stream);
          int putc(int character,FILE *stream);
          int putchar(int character);
     第1个参数是要被打印的字符。在被打印之前,函数把这个整形参数裁剪为一个无符号字符型值。如果由于人和原因导致函数关闭,它们就返回EOF。

字符I/O宏
     fgetc和fputc都是真正的函数,但getc、putc、getchar和putchar都是通过#define指令定义的宏。宏在执行时间上效率稍高,而函数在程序的长度方面更胜一筹。之所以提供两种类型的方法,是为了允许你根据程序的长度和执行速度哪个更重要选择的方法。这个区别实际上不必太看重,通过对实际程序的观察,不论采用何种类型,其结果通常相差甚微。

撤销字符I/O
     ungetc函数
          int ungetc(int character,file *stream);
     ungetc把一个先前读入的字符返回到流中,这样它可以在以后被从新读入。
     每个流都允许至少一个字符被退回。如果一个流允许退回多个字符,那么这些字符再次被读取的顺序就以退回时的反序进行。注意把字符退回到流中和写入到流中并不相同。与一个流相关联的外部存储并不受ungetc的影响。
     退回字符和流的当前位置有关,所以如果用fseek、fsetpos或rewind函数改变了流的位置,所有退回的字符都将被丢弃。

未格式化行I/O
     gets和puts
          char *fgets(char *buffer,int buffer_size,FILE *stream);
          char *gets(char const *buffer);
          int fputs(char const *buffer,FILE *stream);
          int puts(char const *buffer);
     fgets从指定的streamm读取字符并把他们赋值到buffer中。当它读取一个换行符并存储到缓冲区之后就不再读取。如果缓冲区内存储的字符数达到buffer_size-1个时它也停止读取。在这种情况下,并不会出现数据丢失的情况,因为下一次调用fgets将从流的下一个字符开始读取。在任何一种情况下,一个NUL字节将被添加到缓冲区所存储数据的末尾,使他成为一个字符串。
     如果在任何字符读取前就达到了文件尾,缓冲区就文进行修改,fgets函数返回一个NULL指针。否则,fgets返回它的第1个参数。这个返回值通常只用于检查是否到达了文件尾。
     传递个fputs的缓冲区必须包含一个字符串,它的字符被写入到流中。这个字符串预期以NUL字节结尾,所以这个函数没有一个缓冲区长度参数。这个字符串是逐字写入的;如果它不包含一个换行符,就不会写入换行符。如果它包含了好几个换行符,所有的换行符都会被写入。因此,当fgets每次都读取一整行时,fputs却既可以一次写入一行的一部分,也可以一次写入一整行,甚至可以一次写入好几行。如果写入时出现了错误,fputs返回常量值EOF,否则它将返回一个非负值。
     缓冲区长度的正确值通常是根据需要执行的处理过程的本质而做出的这种。但是,及时溢出它的缓冲区,fgets也绝不因此错误。
     注意fgets无法把字符串读入到一个长度小于两个字符的缓冲区,一碗内其中一个字符需要为NUL字节保留。
     fets和puts当gets读取一行输入时,并不在缓冲区中存储结尾的换行符。当puts写入一个字符串时,它在字符串写入之后向输出再添加一个换行符。
     gets无法判断缓冲区的长度。如果一个长输入行读到一个短的缓冲区,多出来的字符将被写入到缓冲区后面的内存为止。

格式化的行I/O
     scanf家族
          int fscanf(File *stream,char const *format,...);
          int scanf(char const *format,...);
          int sscanf(char const *string,char const *format,..);
     这些函数都从输入源读取字符并根据format字符串给出的格式代码对他们进行转换。fscanf的输入员就是作为参数给出的流,scanf从标准输入读取,而sscanf则从第1个参数所给出的字符串中读取字符。
     当个书画字符串到达末尾或者读取的输入不再匹配格式字符串所指定的类型时,输入就停止。在任何一种情况下,被转换的输入值的数目作为函数的返回值返回。如果在任何输入值被转换之前文件就已到达尾部,函数就返回常量值EOF。
     
scanf格式代码
     scanf函数家族的格式代码都以一个百分号开头,后面可以是一个可选的星号,一个可选的宽度,一个可选的限定符,格式大妈。星号将使转换后的值被丢弃而不是进行存储。这个技巧可以用于跳过不需要的输入字符。宽度以一个非负的整数给出,它限制将被读取用于转换的输入字符的个数。如果未给出宽度,函数就连续读入字符直到遇见输入中的下一个空白字符。限定符用于修改有些格式代码的含义。
使用限定符的结果
格式码 h l L
d,i,n short long  
o,u,x unsigned short unsigned long  
e,f,g   double  long double

     限定符的目的是为了指定参数的长度。如果整型参数比缺省的整型值更短或更长时,在个时代吗中省略限定符就是一个常见的错误。对于浮点类型也是如此。如果省略了限定符,可能会导致一个较长变量只有部分被初始化,或者一个较短变量的邻近变量也被修改,这些都取决于这些类型的相对长度。
     在一个缺省的整形长度和short相同的机器上,在装换一个short值时限定符h并非必须。但是,对于那些缺省的整型长度比shrot长的及其上,这个限定符是必须的。因此,如果在装换所有short和long型整形术之和long double型变量时都是用适当的限定符,程序将更具可移植性。
scanf格式码

代码 参数 含义
c char * 读取和存储单个字符。不跳过前导空白字符,如果给出宽度,就读取和存储这个数目的字符。字符后面不会添加一个NUL字节。参数必须指向一个足够大的字符数组
i
d
int * 一个可选的有符号整数被转换。d十进制;i根据它的1个字符决定值的基数,就像整型字面量常量的表示形式一样
u
o
x
unsigned* 一个可选的有符号整数倍转换,但它按照无符号数存储。如果使用u值被解释为十进制数;如果使用o,值被解释为八进制数;如果使用x值被解释为十六进制数。X和x同义
e
f
g
float* 期待一个浮点值。它的形式必须像一个浮点型字面值常量,但小数点并非必须。E、G同e、g
s char * 读取一串非空白字符。参数必须指向一个足够大的字符数组。当发现空白时输入就停止,字符串后面会自动加上NUL终止符。
[xxx] char* 正则表达式
p void* 输入与其为一串字符,注入那些由printf函数的%p格式代码所产生的输出。它的转换方式引编译器而异,但转换节骨将和按照上面描述的进行打印所产生的字符的值是相同的
n int* 到目前为止通过这个scanf函数的调用从输入读取的字符数被返回。%n转换的字符并不计算在scanf函数的返回值之内。它背身不消耗任何输入
这个代码与输入中的一个¥相匹配,该%符号将被丢弃

printf家族用于创建格式化的输出
          int fprintf(FILE *stream,char const *format,...);
          int printf(char const *format,...);
          int sprintf(char *buffer,char const *format,...);
     printf函数原型中的format字符串肯能包含格式代码,它使参数列表的下一值根据指定的方式进行格式化。格式代码由一个百分号开头,后面跟另个或多个标志字符,用于修改有些转换的执行方式、一个可选的最小字段宽度,一个可选的精度,一个可选的修改付,转换类型。
printf格式代码
代码 参数 含义
c int 参数被裁剪为unsigned char类型并作为字符进行打印
d
i
int 参数作为一个十进制整数打印。如果给出了精度而且值的位数少于精度位数,前面就用0填充
u
o
x,X
unsigned int 参数作为一个无符号值打印,u十进制,o八进制,x或X使用十六进制。x约定使用小写,X大写
e
E
double 参数根据指数形式打印。小数点后面的位数由精度字段决定,缺省为6
f double 参数按照常规的浮点格式打印。精度字段决定小数点后面的位数,缺省6
s char* 打印一个字符串
p void* 制针织被转换为一串银编译器而异的可打印字符。这个代码主要是和scanf中的%p代码组合使用
n int* 这个代码不产生任何输出。相反,到目前为止函数所产生的输出字符数目将被保存到对应的参数中
% 打印一个%字符

printf格式标志
标志 含义
- 值在字段中左对齐,缺省情况下是右对齐
0 当数值为右对齐时,缺省情况下是使用空格填充值左边未使用的列。这个标志表示用0来填充,它可用于d,i,u,o,x,X,e,E,f,g,G代码。使用d,i,u,o,x,X时,如果给出了精度字段,零标志就被忽略。如果格式代码中出现了负号标志,零标志也没有效果
+ 当用于一个格式化某个有符号值的代码时,如果值非负,正好标志就会给它加上一个正号。
空格 只用于转换有符号值的代码。当值非负时,这个标志把一个空格添加到它开始的位置。注意这个标志和正号标志是互相排斥的,如果两个同时给出,空格标志便被忽略
# 选择某些代码的另一种转换形式。

如果用于表示字段宽度或精度的十进制整数由一个星号代替,那么printf的下一个参数就提供宽度和精度。当字符或段整数值作为printf函数的参数时,他们在传递给函数之前先转换为整数。
printf格式代码修改符

修改符 用于…时 表示参数是...
h di,i,u,o,x,X 一个可能是无符号short型整数
h n 一个指向short型整数的指针
l d,i,u,o,x,X 一个可能是无符号long型整数
l n 一个指向long double型的指针
L e,E,f,g,G 一个long double型值
     在有些环境里,int和short int的长度相等,此时h修改符就没有效果。否则,当short int作为参数传递给函数时,这个被转换的值将升级为(无符号)int类型。这个修改付在转换发生之前使它被裁剪回原先的short形式。在十进制转换中,一般不需要进行参见。但在有些八进制或十六进制的转换中,h修改付保证适当位数的数字被打印。
     在int和longint长度相同的及其上,l修改符没有效果。在所有其他机器上,需要使用l修改符,因为这些机器上的长整型分为两部分传递到运行时对战。如果这个修改符并未给出,那就只有第一部分被提取用于转换。这样,不仅转换将产生不正正确的结果,而且这个值的第2部分被解释为一个单独的参数,这样就破坏了后续参数和它们之间的格式代码之间的对应关系。

printf转换的其他形式

用于…… #标志
o 保证产生的值以一个0开头
x,X 在非零值前加0x或0X前缀
e,E,f 确保结果始终包含一个小数点,即使它后面没有数字
g,G 和上面的e,E,f代码相同。缀尾的0并不从小数中去除

二进制I/O
     fread函数用于读取二进制数据,fwrite函数用于写入二进制数据。
          size_t fread(void *buffer,size_t size,size_t count,FILE *stream);
          size_t fwrite(void *buffer,size_t size,sie_t count,FILE *stream);
     buffer是一个指向用于保存数据的内存位置的指针,size是缓冲区中每个元素的字节数,count是读取或写入的元素数,stream是数据读取或写入的流。

     buffer参数被解释为一个或多个值的数组。count参数指定数组中有多少个值,所以读取或写入一个标量时,count的值应为1.函数的返回值是实际读取或写入的元素(非字节)的数目。如果输入过程中遇到了文件尾或输出过程中出现了错误,这个数字可能比请求的元素数目要效。

刷新和定位函数
     fflush迫使一个输出流的缓冲区内的数据进行物理写入,不管它是不是已经写满。
          int fflush(FILE *stream);
     C支持随机访问I/O,也就是以任意顺序访问文件的不同位置。随机访问是通过在读取或写入先前定位到文件中需要的位置来实现的。
          long ftell(FILE *stream);
          int fseek(File *stream,long offset,int from);
     ftell函数返回流的当前位置,也就是说,下一个读取或写入将要开始的位置距离文件起始位置的偏移量。这个函数允许保存一个文件的当前位置,这样可能在将来返回到这个位置。在二进制流中,这个值就是当前位置距离文件起始位置之间的字节数。
     在文本流中,这个值表示一个位置,但它并不一定准确的表示当前为值和文件起始位置之间的字符数,因为有些系统将对行末字符进行翻译转换。但是ftell函数返回的值总是可以用于fseek函数中,俎我为一个距离文件起始位置的偏移量。
     fseek函数允许在一个流中定位。这个操作将改变下一个读取或写入操作的位置。它的第1个参数是需要改变的流。第2和3个参数标识文件中需要定位的位置。

fseek参数
如果from是 将定位到
SEEK_SET 从流的起始位置起offset个字节,offset必须是一个非负值
SEEK_CUR 从流的当前位置起offset个字节,offset可正可负
SEEK_END
从流的尾部位置起offset个字节,
offset可正可负,如果正,将定位到文件尾的后面

     视图定位到一个文件的起始位置之前是一个错误。定位到文件尾之后并进行写入将扩展这个文件。定位到文件尾之后并进行读取将导致返回一条到达文件尾的信息。在二进制六中,从SEEK_END进行定位可能不被支持,所以应该避免。在文本流中,如果frome是SEEK_CUR或SEEK_END,offset必须是零。如果from是SEEK_SET,offset必须是一个从同一个流中以前调用ftell所返回的值。
     用fseek改变一个流的位置会带来三个副作用。首先,行末指示字符被清除。其次,如果在fseek之前使用ungetc把一个字符返回到流中,那么这个被退回的字符会被丢弃,因为在定位操作以后,它不再是“下一个字符”。最后,定位允许从写入模式切换到读取模式,或者回到打开的流以便更新。
     另外还有三个额外的函数,用一些限制更严的方式执行相同的任务。
          void rewind(FILE *stream);
          int fgetpos(FILE *stream,fpos_t *position);
          int fsetpos(FILE *stream,fpos_t const *position);
     reweind函数将读写指针设置回指定流的起始位置。同时清除流的错误提示标志。fgetpos和fsetpos分辨是ftell和fseek的替代方案。
     它们的主要区别在于这对函数接受一个指向fpos_t指针作为函数。fgetpos在这个位置存储文件的当前位置,fsetpos把文件位置设置为存储在这个位置的值。
     用fpost_t表示一个文件位置的方式并不是由标准定义的。它可能是文件中的一个字节偏移量,也可能不是。因此,使用一个从fgetpos函数返回的fpost_t类型的值唯一安全的用法是把它作为参数传递给后续的fsetpos函数。

改变缓冲方式
     这两个函数只有当指定的流被打开但还没有在它上面执行任何其他操作前才能被调用。
          void setbuf(FILE *stream,char *buf);
          int setvbuf(FILE *stream,char *buf,int mode,size_t size);
     setbuf设置了另一个数组,用于对流进行缓冲。这个数组的字符长度必须在BUFSIZ(在stdio.h中定义)。为一个流自行指定缓冲区可以防止I/O函数库为它动态分配一个缓冲区。如果用一个NULL参数调用这个函数,setbuf函数将关闭流的所有缓冲方式。字符准确的将程序所规定的方式进行读取和写入
     为流缓冲区使用一个自动数组是很危险的。如果在流关闭之前,程序的执行流离开了数组声明坐在的代码块,流就会继续使用这块内存,但此时它可能已经分配给了其他函数。
     setvbuf。mode参数用于指定缓冲类型。_IOFBF指定一个完全缓冲的流,_IONBF指定一个不缓冲的流,_IOLBF指定一个行缓冲流。就是每当一个换行符写入到缓冲区是,缓冲区便进行刷新。
     buf和size参数用于指定需要使用的缓冲区。如果buf为NULL,那么size的值必须是0.一般而言,最好用一个长度为BUFSIZ的字符数组做缓冲区。

流错误函数
     判断流的状态
          int feof(FILE *stream);
          int ferror(FILE *stream);
          void clearerr(FILE *stream);
     如果流当前处于文件尾,feof函数返回真。这个状态可以通过对流执行fseek、rewind或fsetpos来清除。ferror函数报告流的错误状态,如果出现任何读写错误函数返回真。clearerr函数对指定流的错误标志进行充值。

临时文件
     tempfile函数
          FILE *tmpfile(void);
     这个函数创建了一个文件,当文件被关闭或程序终止时这个文件便自动删除。该文件以wb+模式打开,这使它可用于二进制和文本数据。
     如果临时文件必须以其他模式打开或者由一个程序打开但由另一个程序读取,就不适合用tmpfile函数创建。必须用佛喷函数,当结果文件不再需要时使用remove函数显示删除。
     临时文件的名字可以用tmpnam函数创建
          char *tmpnam(char *name);
     如果传递给函数的参数为NULL,那么这个函数便返回一个指向静态数组的指针,该数组包含了被创建的文件名。否则,参数便嘉定是一个指向长度至少为L_tmpnam的字符数组的指针。在这种情况下,文件名在这个数组中创建,返回值就是这个参数。
     无论那种情况,这个被创建的文件名保证不糊与已存在的文件名同名。只要调用次数不超过TMP_MAX此,tmpnam函数每次调用时都能产生一个新的不同名字。

文件操纵函数
     用于操纵文件但不执行任何输入、输出操作。如果执行成功,两个函数都返回零值,失败都返回非零值。
          int remove(char const *filename);
          int rename(char const *oldname,char const *newname);
     remove函数删除一个指定的文件。如果当remove被调用时文件处于打开状态,其结果取决于编译器
     rename函数用于改变一个文件的名字,从oldname改为newname。如果已经有一个名为newname的文件存在,结果取决于编译器。如果这个函数实拍,文件仍然可以用原来的名字进行访问。











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值