一般在程序设计中的文件类型有两种:程序文件、数据文件。
程序文件:包括源程序文件(.c)、目标文件(.obj)、可执行文件(.exe)
数据文件:该文件的内容不是程序,而是程序运行时读写的数据。本篇博客就是对数据文件的操作的讨论。
struct _iobuf{
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
(1)数据文件的打开
(2)数据文件的关闭
//mode:打开方式
"r"(只读,覆盖写):为了输入数据,打开一个已经存在的文本文件。如果指定文件不存在则出错。
"w"(只写):为了输出数据,打开一个文本文件。如果指定文件不存在则建立一个新的文件。
"a"(追加写):向文本文件尾添加数据。如果指定文件不存在则出错。
"rb"(只读,覆盖写):为了输入数据,打开一个二进制文件。如果指定文件不存在则出错。
"wb"(只写):为了输出数据,打开一个二进制文件。如果指定文件不存在则建立一个新的文件。
"ab"(追加写):向一个二进制文件尾添加数据。如果指定文件不存在则出错。
"r+"(读写):为了读和写,打开一个文本文件。如果指定文件不存在则出错。
"w+"(读写):为了读和写,建立一个新的文件。如果指定文件不存在则建立一个新的文件。
"a+"(读写):打开一个文件,在文件尾进行读写。如果指定文件不存在则建立一个新的文件。
"rb+"(读写):为了读和写打开一个二进制文件。如果指定文件不存在则出错。
"wb+"(读写):为了读和写,新建一个新的二进制文件。如果指定文件不存在则建立一个新的文件。
"ab+"(读写):打开一个二进制文件,在文件尾进行读和写。如果指定文件不存在则建立一个新的文件。
#include
int main()
{
FILE *pf;
pf = fopen("mytest.txt", "w");//以只写模式打开,若不存在该文件则创建。
if (pf != NULL)
{
fclose(pf);
}
return 0;
}
(1)数据文件的顺序读写
①fgetc
#include
int main()
{
FILE *pf;
int c;
pf = fopen("mytest.txt", "r");//以只读模式打开,上面已经创建了该文件。
while ((c = fgetc(pf)) != EOF)
{
printf("%c ", c);
}
printf("\n");
fclose(pf);
return 0;
}
#include
int main()
{
FILE *pf;
int c;
pf = fopen("mytest.txt", "a");//以追加写模式打开,上面已经创建了该文件。
fputc('I', pf);
fclose(pf);
pf = fopen("mytest.txt", "r");//以只读模式打开
while ((c = fgetc(pf)) != EOF)
{
printf("%c ", c);
}
printf("\n");
fclose(pf);
return 0;
}
#include
int main()
{
FILE *pf;
char str[100];
pf = fopen("mytest.txt", "a");//以追加写模式打开,上面已经创建了该文件。
fputc('I', pf);
fclose(pf);
pf = fopen("mytest.txt", "r");//以只读模式打开
fgets(str, 12, pf);
puts(str);
fclose(pf);
return 0;
}
#include
int main()
{
FILE *pf;
char str[100];
pf = fopen("mytest.txt", "a");//以追加写模式打开,上面已经创建了该文件。
fputs(" am sheena", pf);
fclose(pf);
pf = fopen("mytest.txt", "r");//以只读模式打开
fgets(str, 22, pf);
puts(str);
fclose(pf);
return 0;
}
#include
int main()
{
FILE *pf;
pf = fopen("mytest.c", "w");
fputc('s', pf);
fputs("\nsheena\n", pf);
fprintf(pf,"语文:%d\n数学:%d\n英语:%d\n", 98, 110, 99);
fclose(pf);
return 0;
}
⑥fscanf
#include
int main()
{
FILE *pf;
int a, b, c;
pf = fopen("mytest.c", "r");
fscanf(pf,"语文:%d\n数学:%d\n英语:%d\n", &a, &b, &c);
printf("%d,%d,%d\n", a, b, c);
fclose(pf);
return 0;
}
⑧fwrite
#include
#include
#include
struct TelInfo
{
char _name[24];
char _tel[16];
int _age;
};
char *my_itoa(int n, char* buf)
{
assert(buf);
int i = 0;
while (n)
{
buf[i] = n % 10 + '0';
n /= 10;
++i;
}
int begin = 0, end = i - 1;
while (begin < end)
{
char tmp = buf[end];
buf[end] = buf[begin];
buf[begin] = tmp;
++begin;
--end;
}
buf[i] = '\0';
return buf;
}
int main()
{
struct TelInfo info;
strcpy(info._name, "sheena");
strcpy(info._tel, "153****5645");
info._age = 20;
FILE *fp = fopen("telinfo.c", "wb");
fwrite(&info, sizeof(info), 1, fp);
fclose(fp);
struct TelInfo other;
FILE *fp2 = fopen("telinfo.c", "rb");
fread(&other, sizeof(other), 1, fp2);
fclose(fp2);
printf("%s,%s,%d\n", other._name, other._tel, other._age);
return 0;
}
(2)数据文件的随机读写
①fseek
//origin
不变 参考位置
SEEK_SET 文件开始
SEEK_CUR 文件指针的当前位置
SEEK_END 文件结尾*
#include
int main()
{
FILE *pf;
pf = fopen("test.c", "wb");
fputs("I am Sheena", pf);
fseek(pf, 9, SEEK_SET);
fputs("hello", pf);
fclose(pf);
return 0;
}
#include
//获取一个文件的大小
int main()
{
FILE *pf;
pf = fopen("test.c", "r");
fseek(pf, 0, SEEK_END);
long int sz = ftell(pf);
printf("%d\n", sz);
fclose(pf);
return 0;
}
#include
int main()
{
FILE *pf;
pf = fopen("test12.c", "w");
fputs("hello world\n", pf);
rewind(pf);
fputs("sheena:\n", pf);
fclose(pf);
return 0;
}
#include
int main()
{
FILE *pf;
pf = fopen("test12.c", "r");
int c;
while ((c = fgetc(pf)) != EOF)
putchar(c);
if (ferror(pf))
puts("error");
else if (feof(pf))
puts("end of the file");
fclose(pf);
return 0;
}
#include
#include
#include
struct TelInfo
{
char _name[24];
char _tel[16];
int _age;
};
char *my_itoa(int n, char* buf)
{
assert(buf);
int i = 0;
while (n)
{
buf[i] = n % 10 + '0';
n /= 10;
++i;
}
int begin = 0, end = i - 1;
while (begin < end)
{
char tmp = buf[end];
buf[end] = buf[begin];
buf[begin] = tmp;
++begin;
--end;
}
buf[i] = '\0';
return buf;
}
int main()
{
struct TelInfo info;
strcpy(info._name, "sheena");
strcpy(info._tel, "153****5645");
info._age = 20;
方法一:二进制读写法
//FILE *fp = fopen("telinfo.c", "wb");
//fwrite(&info, sizeof(info), 1, fp);
//fclose(fp);
//struct TelInfo other;
//FILE *fp2 = fopen("telinfo.c", "rb");
//fread(&other, sizeof(other), 1, fp2);
//fclose(fp2);
//printf("%s,%s,%d\n", other._name, other._tel, other._age);
//方法二:文本读写法1
FILE *fpout = fopen("input.c", "w");
fputs(info._name, fpout);
fputc('\n', fpout);
fputs(info._tel, fpout);
fputc('\n', fpout);
char age_buf[12];
my_itoa(info._age, age_buf);
fputs(age_buf, fpout);
fputc('\n', fpout);
fclose(fpout);
struct TelInfo other;
FILE *fpin = fopen("input.c", "r");
fscanf(fpin, "%s\n%s\n%d\n", other._name, other._tel, &other._age);
fclose(fpin);
printf("%s,%s,%d\n", other._name, other._tel, other._age);
方法三:文本读写法2
//FILE *fp = fopen("telinfo.c", "w");
//fprintf(fp, "%s\n%s\n%d\n", info._name, info._tel, info._age);
//fclose(fp);
//
//struct TelInfo other;
//FILE *fpin = fopen("telinfo.c", "r");
//fscanf(fpin, "%s\n%s\n%d\n", other._name, other._tel, &other._age);
//fclose(fpin);
//printf("%s,%s,%d\n", other._name, other._tel, other._age);
return 0;
}