C程序中对流的访问是通过文件指针(file pointer)实现的。此指针的类型为FILE*
(FILE类型在<stdio.h>
中声明),用文件指针表示的特定流具有标准的名字,如果需要,还可以声明另外一些文件指针。
例如:FILE *fp1, *fp2
;
标准流和重定向
<stdio.h>
提供了3种标准流。可以直接使用,无需声明
文件指针 | 流 | 默认的含义 |
---|---|---|
stdin | 标准输入 | 键盘 |
stdout | 标准输出 | 屏幕 |
stderr | 标准错误 | 屏幕 |
许多操作系统可以通过一种称为重定向(redirection)的机制来改变默认含义。
文本与二进制文件
<stdlib.h>
支持两种二进制类型的文件:文本文件(text file)
和二进制文件(binary file)。
文本文件具有两种二进制文件没有的特性。
- 文本文件分为若干行
- 文本文件可以包含一个特殊的“文件末尾”标记
用二进制形式存储数可以节省大量的空间
文件操作
打开文件
FILE *fopen(const char * restrict filename, const char * restrict mode)
;
restrict
表明filename
和mode
所指向的字符串的内存单元不共享。
注意:Windows程序员
会被看成是转义字符
解决方法:
- 使用\替代
- 使用/
fopen
函数返回一个指针
常见调用形式fp = fopen("in.dat", "r")
;fp
为FILE*
类型的变量
模式
文本文件
字符串 | 含义 |
---|---|
"r" | |
"w" | 打开文件用于写(文件不需要存在) |
"a" | 打开文件用于追加(文件不需要存在) |
"r+" | 打开文件用于读和写,从文件头开始 |
"w+" | 打开文件用于读和写(如果文件存在就截去) |
"a+" | 打开文件用于读和写(如果文件存在就追加) |
打开二进制文件+b
关闭文件
int fclose(FILE *stream)
;
fclose函数必须是文件指针,此指针来自fopen函数或freopen函数
如果成功关闭,会返回0;否则返回错误代码EOF(在<stdio.h>
中第一的宏)
为打开的流附加文件
`FILE freopen( const char restrict filename,
const char *restrict mode,
FILE *restrict stream)`;
freopen
函数为已经打开的流附加上一个不同的文件。
最常见的做法是把文件和一个标准流(stdin
, stdout
或stderr
)相关联。
例如:为了使程序开始往文件foo中写数据,可以使用下列:
if (freopen("foo", "w", stdout) == NULL) {
...
}
从命令行获取文件名
int main(int argc, char *argv[])
{
...
}
argc是命令行参数的数量,而argv是指指向参数字符串的指针数组。
argv[0]指向程序的名字,从argv[1]到argv[argc-1]都指向剩余的实际参数
,而argv[argc]是空指针。
临时文件
FILE *tmpfile(void);
char *tmpnam(char *s);
文件缓冲
int fflush(FILE *stream);
void setbuf(FILE *restrict stream, char * restrict buf);
int setvbuf(FILE * restrict stream,
char * restrict buf,
int mode,
size_t size);
缓冲(buffering)
把写入流的数据存储在内存的缓冲区中;当缓冲区满了(或者关闭流)
时,对缓冲区进行“清洗”(写入实际的输出设备)。
输入流可以用类似的方法进行缓冲:缓冲区包含输入设备的数据,从
缓冲区读取而不是此报告设备本身读取。
调用fflush()函数,程序可以按照我们所希望的频率来清洗文件
的缓冲区。
调用fflush(fp);
为和fp相关联的文件清洗缓冲区
调用fflush(NULL)
清洗全部输出流。
如果调用成功,返回0,否则返回EOF
*subvbuf允许改变缓冲流的方法,并且允许控制缓冲区的大小和位置
其它文件操作
int remove(const char *filename);
int rename(const char *old, const char *new);
使用文件名而不是文件指针进行操作。
确保操作之前文件关闭。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。