C语言的文件操作需要包含头文件<stdio.h>,相关函数通常以f开头。打开的文件在内存中有一个结构体,叫FILE。fopen函数用来打开文件,他返回FILE类型的指针。

FILE * f = fopen("c:\\a.txt", "r");
if (f == NULL) printf("文件打开失败");
fopen的第一个参数为文件的路径,其中斜杠需要两个代表一个。第二个参数为打开文件的模式,常用的模式有:
r    只读
w    只写,如果文件已存在,内容会被删除
a    追加内容到文件末尾
r+   读写
如果需要打开的文件是二进制文件,则需要在上面的模式后面添加一个b字符,例如以读写模式打开一个二进制文件:
if (!(f = fopen("c:/a.bin", "rb+")) {exit(0);}
操作文本模式打开的文件采用函数fprintf和fscanf,除了多了文件指针作为第一个参数以外,其使用方式与printf和scanf相同。
fwrite用来写二进制文件,
size_t fwrite(
   const void *buffer,
   size_t size,
   size_t count,
   FILE *stream 
);
第一个参数为要写入文件的内存地址,第二个为一个数据块的大小,第三个是数据块的个数,第四个参数为文件指针。
通常将结构体写入二进制文件,例如:
struct Record {
    char name[16];
    int age;
};

struct Record record[8];
int i;
memset(record, 0, sizeof (record)); // 注意sizeof关键字取得是字节大小
for(i=0;i<sizeof(record)/sizeof(Record);i++)
{
    sprintf(record[i].name, "I'm record %d", i);
    record[i].age = i * 4;
}
if (!(f = fopen("c:/a.bin", "wb")) {exit(0);}
fwrite(record, sizeof(Record), 8, f);
fclose(f);
最后不要忘了用fclose函数关闭打开的文件。
通过fread函数将二进制内容读入内存,例如:
struct Record {
    char name[16];
    int age;
};

struct Record record[8];
if (!(f = fopen("c:/a.bin", "rb")) {exit(0);}
fread(record, sizeof(Record), 8, f);
fclose(f);
和文件相关的函数还有:fseek用于设置当前读取位置,ftell用于获取当前读取位置。
 

总结

文件分成文本文件(例如.txt,.c,.h等)和二进制文件(例如.rmvb,.exe,.zip等),文件打开方式有:只读(r或者rb)、只写(w或者wb)、追加(a或者ab)、读写(r+或者rb+),其中带b的表示是二进制文件。

fopen打开文件后返回文件指针FILE*,其后每个文件的操作都需要带着这个指针,注意有些函数将这个指针作为第一个参数,而另一些则将它作为最后一个参数。文件读写位置只有一个变量(相对于文件开头的偏移量),例如当你以rb+打开一个二进制文件,然后fread进内存32字节,则文件位置编程32,然后再写进去32字节,则写进去的内容被写到文件中偏移32字节处,文件读写位置编程64,用ftell获取当前读写位置,用fseek设置当前读写位置。

对于文本文件,可以用fprintf和fscanf进行格式化输入输出。fprintf需要手动添加换行符"\n"在文件中写入换行。scanf系列函数能够自动过滤空白字符(空格、\t\r\n等)(影响中是这样)。

最后,不要忘记用fclose关闭文件。

 

作业

维护一个用户名密码文件,该文件的格式为:每一行存储一个用户名密码对,用户名和密码之间用冒号分隔。用户通过命令行输入命令,要求支持的命令如下:

  1. load 文件路径
  2. add 用户名 密码
  3. get 用户名
  4. remove 用户名
  5. save 文件路径

第一个命令加载一个存在的密码文件,该文件是一个文本文件。第二个命令向该密码文件中添加一行记录。第三个命令获取一个用户的密码。第四个为删除一个用户的哪一行。第五个是保存并关闭密码文件。

要求:

  1. 用户名只能由大小写字母数字和下划线组成,第一个字符不能为数字。
  2. 用户名不能重复。
  3. 密码不能少于6个字节。

提示:

  1. load的时候使用r打开文件,这个文件必须存在,将所有记录读入内存并关闭文件。
  2. fscanf(fp, "%s:%s", username, password);来读取一行记录。
  3. 保存的时候使用w打开文件,这个文件可以不存在,如果存在会被自动清空。
  4. 使用fprintf(fp, "%s:%s", username, password);保存一行记录。

假设最大支持256个用户,每个用户的用户名密码都最大为15个字节。可以定义:

#define MAX_USER_NUMBER 256

#define MAX_STRING_LENGTH 16

struct User {

    char Name[MAX_STRING_LENGTH ];

    char Password[MAX_STRING_LENGTH ];

};

struct User users[MAX_USER_NUMBER ];

int userNumber=0;

然后将所有存在的用户读入数组users中。

posted on 2011-03-16 10:45  benfish  阅读(552)  评论(0编辑  收藏  举报