Linux程序设计(11)第三章:标准I/O库(3) fopen fread fwrite fclose fflush fseek ftell feof

1. 标准I/O库

标准I/O库(stdio)及其头文件stdio.h为底层I/O系统调用提供了一个通用的接口。
标准I/O库提供了许多复杂的函数用于格式化输出和扫描输入。它还负责满足设备的缓冲需求

2. stdin stdout 和 stderr

在程序启动时,有3个文件流是自动打开的。它们是stdin、stdout和stderr
分别代表着标准输入、标准输出和标准错误输出,与底层文件描述符0、1和2相对应

3. fopen fread fwrite flose fflush fseek feof

3.1 fopen

#include <stdio.h>
FILE *fopen(const char *filename, const char *mode);

mode 参数:

"r"或"rb":以只读方式打开。
"w"或"wb":以写方式打开,并把文件长度截短为零。
"a"或"ab":以写方式打开,新内容追加在文件尾。
"r+"或"rb+"或"r+b":以更新方式打开(读和写)。
"W+"或"wb+"或"w+b":以更新方式打开,并把文件长度截短为零。
或"ab+"或"a+b":以更新方式打开,新内容追加在文件尾。

字母b表示文件是一个二进制文件而不是文本文件。

返回值:
fopen在成功时返一个非空的FILE *指针,失败时返NULL

3.2 fread

fread库函数用于从一个文件流里读取数据
数据从文件流stream读到由ptr指向的数据缓冲区里

#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);

参数:

size 参数指定每个数据记录的长度(字节数)
计数器nitiems 给出要传输的记录的个数

返回值:

返回值是成功读到数据缓冲区里的记录个数(而不是字节数)。
当到达文件尾时,它的返回值可能会小于nitems,甚至可以是零

例子:

1.
fread(&id,1,10,f) 
就是把文件f里面的值读到缓冲区id里面,每次读1个字节,一共读10次,
或者把id里面的值都读完,不到10次也会停止。

2.
/* 每次读一个字节 读1024次 */
while (0 != (len = (UINT)fread (buffer, 1UL, 1024UL, filename))) 
{
    //操作 buffer 
}

3.3 fwrite

从指定的数据缓冲区里取出数据记录,并把它们写到输出流中。
它的返回值是成功写入的记录个数。

#include <stdio.h>
size_t fwrite (const void *ptr, size_t size, size_t nitems, FILE *stream);

例子:

FILE * pstCurrent = NULL;
FILE * pRead;
……
pstCurrent = fopen(test,"w+");

do
{
    szFileBuf[0] = '\0';
    iNum =  fread(szFileBuf, 1,(ULONG)1024, pRead);
    fwrite(szFileBuf, 1,iNum,pstCurrent); //写到另外一个文件

}while(!(feof(pRead)));
/* feof 文件结束:返回非0值;文件未结束:返回0值 */

3.4 fclose

闭指定的文件流stream,使所有尚未写出的数据都写出。

注意:!!!使所有尚未写出的数据都写出。

#include <stdio.h>
int fclose(FILE *stream);

3.4.1 fclose 使所有尚未写出的数据都写出

因为stdio会对数据进行缓冲,所以flose对数据进行都写出。
调用fclose函数隐含执行/一次flush操作

3.5 fflush

把文件流里的所有未写出数据立刻写出。

#include <stdio.h>
int fflush(FILE *stream);

例子:

fputs(pcRules, pFileIn);
fflush(pFileIn);
fclose(pFileIn);

3.6 fseek

移动文件流的读写位置

#include <stdio.h>
int fseek(FILE *stream, long int offset, int whence);

参数:

stream:文件流
offset:正(前移),可以为负(向后移),或者为0(保持不动)。
whence 是模式,该参数确定起始点

返回值:

正常返回0;错误返回-1

例子:

fseek(fp, 0L, SEEK_SET);       				//定位至文件开始处
fseek(fp, 10L, SEEK_SET);      				//定位至文件中的第10个字节
fseek(fp, 2L, SEEK_CUR);      				//从文件当前位置前移2个字节
fseek(fp, 0L, SEEK_END);       				//定位至文件结尾
fseek(fp, -10, SEEK_END);      				//从文件结尾处回退10个字节
fseek(fp,50L,0);或fseek(fp,50L,SEEK_SET);	//将位置指针移到离文件头50个字节处

例子:

fseek 函数是与 lseek 系统调用对应的文件流函数

/* 复制一个备份文件 然后检查是否一样  */
(VOID)fseek(p1, 0L, SEEK_END);
(VOID)fseek(p2, 0L, SEEK_END);
if( ftell(p1) != ftell(p2))
{
     printf("Failed to save current sigpack ");
}

3.7 ftell

对于二进制文件,则返回从文件开头到结尾的字节数。

long int ftell(FILE *stream)

返回给定流 stream 的当前文件位置
ftell() 函数用来获取文件读写指针的当前位置
成功则返回当前的读写位置, 失败返回 -1
对于二进制文件,则返回从文件开头到结尾的字节数。

例子同上

3.8 feof

检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0
(即,文件结束:返回非0值;文件未结束:返回0值)。

猜你喜欢

转载自blog.csdn.net/lqy971966/article/details/120672013