Linux的C语言标准I/O操作

博客介绍了系统自带IO操作基于文件描述符且无缓存,高层应用使用ANSI C标准IO以提高效率。阐述了标准IO相关函数如fopen、fread等的参数和返回值含义,还提醒直接读写结构体程序不可跨平台,指出学习难点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统自带的IO操作,是基于文件描述符的。这些系统的IO操作,是不带缓存区的,在高层的应用里,不带缓存的IO效率低,因此使用的是ANSI C的标准 io 。(C的标准IO是封装了系统的IO给用户使用,这样减少了系统调用的次数,系统调用很浪费资源的。而学了Java的话,会发现它也有更高级的 io ,都是不断堆砌产生的)。
这些函数基本都在<stdio.h>里,如常见的printf(针对标准流)、及其兄弟fprintf(针对文件流)、sprintf(针对字符流)。

相关的函数:
fopen函数:
FILE * fopen(const char * pathname,const char * mode)
size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)
size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream)
int fflush(FILE * fd)
int fclose(FILE * fp)

各自的参数返回值含义是
FILE指针 fopen(绝对/相对路径名,打开的方式)
mode的取值说明:

r :打开只读文件,该文件必须存在。
r+ :打开可读写的文件,该文件必须存在。
rb+ :读写打开一个二进制文件,只允许读写数据。
rt+ :读写打开一个文本文件,允许读和写。
w :打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ :打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a :以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+ :以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
凡是在mode字符串里带有b字符的,即是打开的文件,是二进制文件,不同的打开方式会对文件结尾的处理方式不同,不过Linux系统会自动识别不同类型的文件而忽略这个符号。

size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)
ptr:文本流目的地的地址
size:一个单位的长度
nmenb:多少个单位
stream:即文件指针
返回值:成功则等于或者小于nmemb、失败则返回0

size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream)
ptr:文本流来源地的地址
size:一个单位的长度
nmenb:多少个单位
stream:即文件指针
返回值:成功则等于或者小于nmemb、失败则返回0

int fflush(FILE * fp)
flush:即是刷新作用是把缓存区的内容刷新到文件(写入到文件里去)。
fp:文件指针
返回值:成功为0,失败非0

int fclose(FILE * fp)
fclose功能:将缓存区的内容刷新到文件(写入到文件里去),并关闭文件。
fp:文件指针
返回值:成功为0,失败非0

注意(来自课本的提示):
直接在文件中读写结构体的程序是不能移植到其他平台的。即在一种平台上编译通过生成的可执行文件,在另一个平台直接运行,办不到。因为,不同平台的大小端可能不同(大小端这个,学了嵌入式就很好理解),结构体填充的方式也可能不同(因而同一个结构体所占的字节数也可能不同)。

难点:
–fopen的mode的熟悉(记住常用几个也行,或者有规律)
–传递的字符串,用char []最佳。

程序:

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

/*****
功能设计:
open一个不存在的文件,写入,再换一个绝对路径的文件  
读取,最后关闭 

注意: 
写入和读取必须对应,写是w的话,读就是r。即是不能有功能叠加。 
对于write,可以是char[]或者char *,但是read必须是char[]这种才行(可能是不能动态分配内存吧)

*****/ 
 
int main()
{
	FILE * File;
	//char BufferWrite[5] = {'a','b','c','d','e'}; 
	char * BufferWrite = "this is for c_io";
	//char * BufferRead;
	char  BufferRead[20];
	
	//只写方式打开,并写入 
	File = fopen("temp.txt","w");
	if(File == NULL){
		printf("File is NULL\n");
		return -1;
	}
	
	fwrite(BufferWrite,sizeof(char),30,File);
	//其实这个要不要都行 
	fflush(File);
	
	fclose(File);
	//只读方式打开,并读取 
	File = fopen("temp.txt","r");
	if(File == NULL){
		printf("File is NULL\n");
		printf("jia\n");
		return -1;
	}
	
	fread(BufferRead,sizeof(char),20,File);
	
	printf("jiayi\n");
	printf("%s\n",BufferRead);
	
	fclose(File);
	return 0;
	
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值