APUE学习笔记:常用标准IO函数

标准IO库函数

fopen()

函数原型:FILE* fopen(const char* path,const char* mode)
**功能描述:**函数 fopen 打开 一个 文件, 并且 分配 一个流。 文件名 由 字符串 path 指定.

参数 mode 指向 一个 字符串, 该 字符串 用 下面 的 字符串 开头 返回的是一个结构体指针,指向的是一个结构体对象,不能直接使用,要交给其它函数使用

**返回值:**文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。

mode:

   r      Open text file for reading.  The stream  is  positioned  at  the beginning of the file.
   //(read)以只读方式打开,文件不存在则打开失败,返回值为空
   r+     Open  for  reading and writing.  The stream is positioned at the beginning of the file.//以只读写方式打开,文件不存在则打开失败,返回值为空

   w      Truncate file to zero length or create text  file  for  writing.
          The stream is positioned at the beginning of the file.//以只写方式打开,文件不存在则创建,文件存在则清空

   w+     Open  for  reading  and writing.  The file is created if it does not exist, otherwise it is truncated.  The stream is  positioned at the beginning of the file.//以只读写方式打开,文件不存在则创建,文件存在则清空
   a      Open  for  appending (writing at end of file).  The file is cre‐ ated if it does not exist.  The stream is positioned at the  end of the file.//以只写方式打开,文件不存在则创建,文件存在则追加

   a+     Open  for  reading  and appending (writing at end of file).  The file is created if it does not exist.  The initial file position for  reading  is  at  the  beginning  of the file, but output is always appended to the end of the file.//添加读权限

注意:

mode 要以beginning with 开始,意思是错误返回errno =2 //无文件

errno 文件在/user/include/asm_generic/errno_base.h

返回值存放的指针所指向的结构体存放在 堆区,(静态区会重新覆盖只适合一次调用的,栈区没有生命周期)如果像这些互逆的函数大多数在堆区,适合调用释放。

想要显示errno massage就要使用perror(“ ”); 翻译文件错误原因,输出时使用

或者在输出的时候使用printf(“路径”,strerror(errno)),在使用strerror时需要使用string.h头文件。strerror()来自己翻译

fclose(fp);

**函数原型:**int fclose(FILE *stream);

**功能描述:**关闭流

**返回值:**成功执行返回 0,否则返回 EOF 并设置全局变量 errno 来指示错误发生。任何一种情况下,对流再进行存取 (包括再次调用 fclose()) 都会带来未定义的结果。

注意: 先调用流后关闭,ulimit -a查看资源占用状态

fgetc()

**函数原型:**int fgetc(FILE *stream);//放在循环里挨个读

**功能描述:**从文件流中读取一个字符

返回值: 成功返回读取到的字符,读到文件结尾时返回EOF。

**注意:**fget() 返回的字符实际上是文件流( FILE 结构体)中位置指针所指向的字符。fgetc()读取错误时,返回EOF并设置文件错误标志位;ferror() 函数可检测此错误。

fputc()

**函数原型:**int fputc(int c,FILE *strean);//挨个写

功能描述: 将字符c写到文件指针fp所指向的文件的当前写指针的位置

**返回值:**如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF,并设置错误标识符。

使用fputc和fgetc实现mycpy

#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>

int main()
{
	FILE *fp;
	FILE *fp1;

fp = fopen("src","r");

if(fp==NULL)
{
	perror("fopen()");
	return (-1);
}
fp1 = fopen("dest","a");
if(fp1==NULL)
{
	fclose(fp);
	perror("fopen()");
	
}
while(1)
{
	int c;
	c = fgetc(fp);
	fputc(c,fp1);
	if(c == EOF)
		break;	
	printf("11111111\n");
}
fclose(fp);
fclose(fp1);
exit(0);
}

命令行传参

int main( int argc, char* argv[] )

第一个参数,int型的argc,为整型,用来统计程序运行时发送给main函数的命令行参数的个数,在VS中默认值为1。 
第二个参数,char*型的argv[],为字符串数组,用来存放指向的字符串参数的指针数组,每一个元素指向一个参数。各成员含义如下: 
argv[0]指向程序运行的全路径名 
argv[1]指向在DOS命令行中执行程序名后的第一个字符串 
argv[2]指向执行程序名后的第二个字符串 
argv[3]指向执行程序名后的第三个字符串 
argv[argc]为NULL 
第三个参数,char**型的env,为字符串数组。env[]的每一个元素都包含ENVVAR=value形式的字符串,其中ENVVAR为环境变量,value为其对应的值。平时使用到的比较少。

fprintf()输出重定向

命令:diff比较

fgets()

**函数原型:**char *fgets(char *s, int size, FILE *stream);//(位置,长度,从哪儿拿)

参数:s—这是指向一个字符数组的指针,该数组存储了要读取的字符串

size – 这是要读取的最大字符数(包括最后的空字符)。通常是使用以str传递的数组长度

stream –这是指向FILE对象的指针,该FILE对象标识了要从中读取字符的流。

功能描述: 从文件往内存中读取。

返回值: 如果成功,该函数返回相同的str参数,如果到达文件末尾或者没有读取到任何字符,str内容保持不变,并返回一个空指针,如果发送错误,返回一个空指针。返回值为指针,如果返回值为EOF则返回EOF存放在char*s 指针里

注意:

fgets函数有两种情况可以导致其读取行为正常结束:

1、读到了size-1个字节

2、读到了‘\n’q

fgets(buf,BUFSIZE,fp);

fputs():

函数原型: int fputs(const char *s, FILE *stream);

string 需送入流的字符串指针

stream 一个FILE型的指针

功能描述: 送一个字符串到一个流中,表头文件为:#include<stdio.h>

**返回值:**返回值: 如果成功输入,fputs 返回 0,否则返回EOF(-1)

注意:

​ 使用 fputs()系统不会自动添加换行符,而对应使用 fgets() 时,换行符会被 fgets() 读出来并存储在字符数组的最后,这样当这个字符数组被输出时换行符就会被输出并自动换行,所以说要配合使用。但指定读取长度不要超过,否则没有尾零存放不会换行。

fread()

**函数原型:**size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);//读到ptr指针或者地址 尺寸为size 字节nmemb 从哪儿读

ptr:用来存放数据的内存首地址
size:要读取的字节数
nmemb:要读取的字数
stream:fopen的返回值

功能描述: 从给定流 stream 读取数据到 ptr 所指向的数组中。

返回值: 返回值是nmemb,就是实际存储的字数

例:

struct student_st buf[10] = {};

fread(buf,sizeof(struct student_st),10,fp);

char buf[10]

fwrite()

**函数原型:**size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

ptr:用来读取数据的内存首地址
size:要读取的字节数
nmemb:要读取的字数
stream:fopen的返回值
在这里插入图片描述

功能描述: 从内存按照字符长度和对象个数读取数据写到文件中

**返回值:**返回值是nmemb,就是实际读取到的字数

例:

返回值为成功的对象个数而不是字节数

fseek()

**函数原型:**int fseek(FILE *stream, long offset, int whence);

第一个参数stream为文件指针。

第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移

第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET

功能描述: fseek函数重定位流(数据流/文件)上的位置指针,相当于在文件当中定位,使用它可以到达文件任何位置

​ If whence is set to SEEK_SET(文件首), SEEK_CUR(文件当前位置), or SEEK_END(文件尾), the offset is relative to the start of the file, the current position indicator, or end-of-file, respectively.

​ 例如:fseek(fp,4,SEEK_SET);文件首正方向偏移四字节

**返回值:**成功返回0值,失败非0,并且可以设置error的值,也可以用perror函数输出错误。

注意:

注意:fseek函数只能查看2G以内的文件长度,后人用fseeko来获取位置,但fseek移植性较好,fsseko移植性不够好。

​ 空洞文件里面全部都是尾零

例:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>


int main()
{
	FILE *fp;

	fp = fopen("tmp.log","r+");
	if(fp == NULL)
	{
		printf("fopen():%s\n",strerror(errno));
		exit(1);
	}		

	fseek(fp,4,SEEK_SET);
	
	fputc('X',fp);


	fclose(fp);
	
	exit(0);

}
ftell()

函数原型: long int ftell(FILE *stream)

**功能描述:**ftell()函数返回指定流的文件指示器指针的当前值。 如果是二进制流,它将从头开始以字节为单位返回位置。

返回值: 返回给定流 stream 的当前文件位置。

注意: 返回类型: long int

rewind()

函数原型: long ftell(FILE *stream);

**功能描述:**用于得到文件位置指针当前位置相对于文件首的偏移字节数

返回值: long int

注意:

文件位置初始化到开始

fflush()

函数原型: int fflush(FILE *stream)

功能描述: fflush()的作用是用来刷新缓冲区

注意:

第五章5.4缓冲5.8 5.13

缓冲区有三种模式,暂存空间,大多数情况下,缓冲器的存在是好事,作用是合并系统调用

输出部分缓冲
在这里插入图片描述

行缓冲:stdout,换行输出,满了输出,强制刷新

全缓冲:默认,(只要不是终端设备,全采用全缓冲模式)满了时,强制刷新

无缓冲:stderr,需要立即输出

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>

/*
缓冲区:暂存空间,大多数情况下,缓冲区的存在是件好事,作用合并系统调用 
行缓冲:stdout,换行时,满了时,强制刷新
全缓冲:默认,(只要不是终端设备,全采用全缓冲模式)满了时,强制刷新 
无缓冲:stderr,需要立即输出

*/

int main()
{
	int i;

	for(i = 0 ; i < 5; i++)
	{
		putchar('x');
		sleep(1);
	}
	
	putchar('\n');



	exit(0);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值