1

C程序中对流的访问是通过文件指针(file pointer)实现的。此指针的类型为FILE*(FILE类型在<stdio.h>中声明),用文件指针表示的特定流具有标准的名字,如果需要,还可以声明另外一些文件指针。
例如:FILE *fp1, *fp2;

标准流和重定向

<stdio.h>提供了3种标准流。可以直接使用,无需声明

文件指针 默认的含义
stdin 标准输入 键盘
stdout 标准输出 屏幕
stderr 标准错误 屏幕

许多操作系统可以通过一种称为重定向(redirection)的机制来改变默认含义。

文本与二进制文件

<stdlib.h>支持两种二进制类型的文件:文本文件(text file)
和二进制文件(binary file)。

文本文件具有两种二进制文件没有的特性。

  1. 文本文件分为若干行
  2. 文本文件可以包含一个特殊的“文件末尾”标记

用二进制形式存储数可以节省大量的空间

文件操作

打开文件

FILE *fopen(const char * restrict filename, const char * restrict mode);

restrict 表明filenamemode所指向的字符串的内存单元不共享。

注意:Windows程序员
会被看成是转义字符
解决方法:

  1. 使用\替代
  2. 使用/

fopen函数返回一个指针
常见调用形式
fp = fopen("in.dat", "r");
fpFILE*类型的变量

模式

文本文件

字符串 含义
"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, stdoutstderr)相关联。
例如:为了使程序开始往文件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);

使用文件名而不是文件指针进行操作。

确保操作之前文件关闭。


AGUILLER
10 声望2 粉丝