C/C++学习笔记六(文件系统、预处理器)

本文详细介绍了C/C++中的文件系统,包括文件缓冲区、读写文件操作和文件指针。在预处理部分,讨论了宏、预定义宏以及内联函数的使用和注意事项,强调了宏定义时避免副作用的重要性。
摘要由CSDN通过智能技术生成

文件系统

文件是指存储在外部存储介质的数据集合(如磁盘光盘等)。操作系统中使用由文件路径和文件名两部分组成的文件标识符来标识文件。
而在C、C++语言中无论是何种文件,都将其看做是一段字节序列。在对其进行读写操作时,以字节流(stream)的方式进行处理。以字节流的方式进行文件操作,很方便的将具体的文件格式都归一为相同流式操作,增强了处理文件的灵活性。

文件缓冲区

因为文件存储在外存介质中,对于CPU而言,访问内存的效率要比访问访问内存的效率更加快。为提高计算机的运行效率,操作系统会分配一块称为文件缓冲区的内存区域,对文件的读写操作会首先在对文件缓冲区进行操作,再在适当的时机,将缓冲区的数据一次写入到外存中。

使用scanf操作时需要注意缓冲区

虽然有文件缓冲区的存在,但在一般的读写文件时并不需要十分理会对于最后缓冲区写入外存的时机。但在使用scanf函数时,需要注意缓冲区问题。
下面的一个例子,我们期望依次输入hello中的每个字符后,将输入的字符串数组打印出来。

char c[6] = { '\0' , '\0' , '\0' , '\0' , '\0', '\0' };
int i = 0;
printf("输入(hello) :\n");
for (size_t i = 0; i < 5; i++)
{
    scanf("%c", &c[i]);
}
printf("输入的内容:%s \n", c);

但当依次输入h ,回车,e,回车,l,回车时,程序便直接执行最后一个printf函数。而且得到的也并不是我们期望的hello。

输入(hello)
h
e
l
输出的内容;h
e
l 

出现这种结果的原因是scanf的实际作用是取标准输入缓冲区中最前的字符,而且换行符也是输入也包含了一个字符,所以在得到的字符串数组具体的值为{ ‘h’,0x0A, ‘e’,0x0A,’l’,0x0A,’\0’} (0x0A为换行符)

这里写图片描述

同样的代码,直接输入hello + 回车时可以达到目的

输入(hello)
hello
输出内容: hello 

同理,这次因为没有换行符的影响,从标准输入缓冲区得到的是我们需要的hello

这里写图片描述

读写文件操作

文件结构体FILE

在使用fopen函数打开文件时,返回一个FILE * 指针,这个FILE结构体称为文件结构,这个结构体存放了一些和本文件中有关的一些信息。但对于不同的操作系统而言,该结构体会有所区别,所以在使用该函数进行跨平台开发时,就需要在理会其中的具体成员。

//打开文件
FILE * fp = fopen("I:\\xx.txt", "r");

在windows平台下,通过查看visual studio 安装目录下VC\include\stdio.h可以看到其具体的结构

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值