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关闭文件。
作业
维护一个用户名密码文件,该文件的格式为:每一行存储一个用户名密码对,用户名和密码之间用冒号分隔。用户通过命令行输入命令,要求支持的命令如下:
- load 文件路径
- add 用户名 密码
- get 用户名
- remove 用户名
- save 文件路径
第一个命令加载一个存在的密码文件,该文件是一个文本文件。第二个命令向该密码文件中添加一行记录。第三个命令获取一个用户的密码。第四个为删除一个用户的哪一行。第五个是保存并关闭密码文件。
要求:
- 用户名只能由大小写字母数字和下划线组成,第一个字符不能为数字。
- 用户名不能重复。
- 密码不能少于6个字节。
提示:
- load的时候使用r打开文件,这个文件必须存在,将所有记录读入内存并关闭文件。
- fscanf(fp, "%s:%s", username, password);来读取一行记录。
- 保存的时候使用w打开文件,这个文件可以不存在,如果存在会被自动清空。
- 使用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中。