C语⾔学习系列:⽂件读写头⽂件本⽂我们来介绍使⽤ C 如何创建、打开、关闭⽂本⽂件或⼆进制⽂件。
打开⽂件
使⽤ fopen( ) 函数
FILE *fopen( const char * filename, const char * mode );
filename 是字符串,⽤来命名⽂件,访问模式 mode 的值可以是下列值中的⼀个:
mode(模
式)
描述
r打开⼀个已有的⽂本⽂件,允许读取⽂件。
w 打开⼀个⽂本⽂件,允许写⼊⽂件。如果⽂件不存在,则会创建⼀个新⽂件。在这⾥,您的程序会从⽂件的开头写⼊内容。如果⽂件存在,则该会被截断为零长度,重新写⼊。
a打开⼀个⽂本⽂件,以追加模式写⼊⽂件。如果⽂件不存在,则会创建⼀个新⽂件。在这⾥,您的程序会在已有的⽂件内容中追加内容。
r+打开⼀个⽂本⽂件,允许读写⽂件。
w+打开⼀个⽂本⽂件,允许读写⽂件。如果⽂件已存在,则⽂件会被截断为零长度,如果⽂件不存在,则会创建⼀个新⽂件。
a+打开⼀个⽂本⽂件,允许读写⽂件。如果⽂件不存在,则会创建⼀个新⽂件。读取会从⽂件的开头开始,写⼊则只能是追加模式。
c语言如何去学如果处理的是⼆进制⽂件,则需使⽤下⾯的访问模式来取代上⾯的访问模式:
"rb", "wb", "ab", "rb+", "wb+", "ab+",
关闭⽂件
使⽤ fclose( ) 函数
int fclose( FILE *fp );
成功关闭⽂件,fclose( ) 函数返回零,如果关闭⽂件时发⽣错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭⽂件,并释放⽤于该⽂件的所有内存。EOF 是⼀个定义在头⽂件 stdio.h 中的常量。
写⼊⽂件
C 标准库提供了各种函数来按字符或者以固定长度字符串的形式读写⽂件。
fputc() 把参数 c 的字符值写⼊到 fp 所指向的输出流中:
int fputc( int c, FILE *fp );
如果写⼊成功,它会返回写⼊的字符,如果发⽣错误,则会返回 EOF。
fputs()函数把字符串 s 写⼊到 fp 所指向的输出流中:
int fputs( const char *s, FILE *fp );
fprintf()函数把⼀个字符串写⼊到⽂件中:
int fprintf(FILE *fp,const char *format, ...)
读取⽂件
fgetc() 函数从 fp 所指向的输⼊⽂件中读取⼀个字符:
int fgetc( FILE * fp );
返回值是读取的字符,如果发⽣错误则返回 EOF。
fgets() 函数从 fp 所指向的输⼊流中读取 n - 1 个字符:
int fputs( const char *s, FILE *fp );
它会把读取的字符串复制到缓冲区 buffer,并在最后追加⼀个 null 字符来终⽌字符串。如果这个函数在读取最后⼀个字符之前就遇到⼀个换⾏符 '\n' 或⽂件的末尾 EOF,则只会返回读取到的字符,包括换⾏符。
fscanf() 函数从⽂件中读取字符串:
int fscanf(FILE *fp, const char *format, ...)
但在遇到第⼀个空格和换⾏符时,fscanf()函数会停⽌读取。
⼆进制输⼊/输出函数
下⾯两个函数通常是⽤于数组或结构等存储块的读写 :
读取 :
size_t fread(void *ptr, size_t size_of_elements,size_t number_of_elements, FILE *a_file);
写⼊:
size_t fwrite(const void *ptr, size_t size_of_elements,size_t number_of_elements, FILE *a_file);
fseek()
该函数可以移动⽂件指针到指定位置读,或插⼊写:
int fseek(FILE *stream, long offset, int whence);
fseek 设置当前读写点到 offset 处, whence 可以是 SEEK_SET,SEEK_CUR,SEEK_END 这些值决定是从⽂件头、当前点和⽂件尾计算偏移量 offset。可以通过定义⼀个⽂件指针 FILE *fp, 当打开⼀个⽂件时,⽂件指针指向开头、当前点或者是⽂件尾,这样要指到多少个字节,只需要去控制偏移量offset
(可正可负)就可以了。
注意: 只有⽤ r+ 模式打开⽂件才能插⼊内容,w 或 w+ 模式都会清空掉原来⽂件的内容再来写,a 或 a+ 模式即总会在⽂件最尾添加内容,哪怕⽤ fseek() 移动了⽂件指针位置。
C 头⽂件
头⽂件是扩展名为 .h 的⽂件,包含了 C 函数声明和宏定义,被多个源⽂件中引⽤共享。有两种类型的头⽂件:程序员编写的头⽂件和编译器⾃带的头⽂件。
以下是假设名称为 headfile.h 的头⽂件:
#ifndef HEADFILE_H//作⽤:防⽌headfile.h被重复引⽤
#define HEADFILE_H
#include<....>//引⽤标准库的头⽂件
...
#include"..."//引⽤⾮标准库的头⽂件
...
void Function1(...);//全局函数声明
...
inline();//inline函数的定义
...
classBox//作⽤:类结构声明
{
...
};
#endif
头⽂件⼀般由四部分内容组成:
(1)头⽂件开头处的版权和版本声明(#ifndef 和 #define);
(2)预处理块(#include);
(3)inline函数的定义;
(4)函数和类结构声明等。
在头⽂件中,⽤ ifndef/define/endif结构产⽣预处理块,⽤ #include 格式来引⽤库的头⽂件。
引⽤头⽂件
使⽤预处理指令 #include 可以引⽤系统和⽤户头⽂件。
#include <file>
这种形式⽤于引⽤系统头⽂件。它在系统⽬录的标准列表中搜索名为 file 的⽂件。
#include "file"
这种形式⽤于引⽤⽤户头⽂件。它先在包含当前⽂件的⽬录中(相对程序⽬录)搜索名为 file 的⽂件,没有才再在系统⽬录搜索。
#include 指令会指⽰ C 预处理器浏览被引⽤的⽂件作为输⼊到主程序⽂件。预处理器的输出即编译器可以看到的包含了已#include之前的⽂本,被引⽤⽂件以及 #include 指令之后的⽂本。
如果⼀个头⽂件被引⽤两次,编译器会处理两次头⽂件的内容,这将产⽣错误。为了防⽌这种情况,标准的做法是把⽂件的整个内容放在条件编译语句(#ifndef 、 #define 和 #endif)中,像 headfile.h 的头⽂件那样。
为了防⽌⼀个头⽂件被引⽤两次,编译器会处理两次头⽂件的内容,因此⽽产⽣错误。我们需要使⽤条件编译语句: #ifndef。
从多个不同的头⽂件中选择⼀个引⽤到程序中:
#if SYSTEM_1
# include "system_1.h"
#elif SYSTEM_2
# include "system_2.h"
#elif SYSTEM_3
...
#endif
#define SYSTEM_H "system_1.h"
...
#include SYSTEM_H

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。