FILE * fopen ( const char * filename, const char * mode );
文件使用方式 | 含义 | 如果指定文件不存在 |
---|---|---|
“r”(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
“w”(只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 |
“a”(追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
“rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
“wb”(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 |
“ab”(追加) | 向一个二进制文件尾添加数据 | 出错 |
“r+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
“w+”(读写) | 为了读和写,建立一个新的文件 | 建立一个新的文件 |
“a+”(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
“rb+”(读写) | 为了读和写打开一个二进制文件 | 出错 |
“wb+”(读写) | 为了读和写,新建一个新的二进制文件 | 建立一个新的文件 |
“ab+”(读写) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新的文件 |
(1)这里的输入和输出是站在内存的角度上的,输入是从文件输入到内存,输出是从内存输出到文件。
(2)什么是文本文件?什么又是二进制文件?
数据在内存中以二进制的形式存储,如果不加转换的输出到外存(文件),就是二进制文件。如果要求在外存(文件)上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
(3)不要看这么多打开方式,在C常用的只有"r"、“w”、"rb"和"wb"这4种。
int fclose ( FILE * stream );
例子
#include
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fclose(pf);
pf = NULL;
return 0;
}
int fputc ( int character, FILE * stream );
int main()
{
FILE* pf = fopen("test.txt", "w");//我们要写入文件,以写的形式打开
if (NULL == pf)
{
perror("fopen");
return 1;
}
int i = 0;
for (i = 'a'; i <= 'z'; i++)
{
fputc(i, pf);//文件里面有指示器,当输入一个字符时,指示器指示下一个位置。
}
fclose(pf);
pf = NULL;
return 0;
}
int fgetc ( FILE * stream );
例子
int main()
{
FILE* pf = fopen("test.txt", "r");//以读的形式打开文件
if (NULL == pf)
{
perror("fopen");
return 1;
}
//读取文件
int ch = 0;
while (ch = fgetc(pf))//当读取一个字符后,指示器指向下一个字符
{
printf("%c ", ch);
}
fclose(pf);
pf = NULL;
return 0;
}
int fputs (const char * str, FILE * stream);
例子
int main()
{
FILE* pf = fopen("test.txt", "w");//以"w"的形式打开,如果先前文件有内容就会被初始化
if (NULL == pf)
{
perror("fopen");
}
fputs("hello world\n", pf);
fputs("welcome", pf);
fclose(pf);
pf = NULL;
return 0;
}
char * fgets ( char * str, int num, FILE * stream );
例子
int main()
{
FILE* pf = fopen("test.txt", "r");
if (NULL == pf)
{
perror("fopen");
return 1;
}
char arr[20] = { 0 };
fgets(arr, 5, pf);
printf("%s", arr);
//fgets(arr, 8, pf);
//printf("%s", arr);
return 0;
}
int fprintf ( FILE * stream, const char * format, ... );
例子
struct Stu
{
char name[20];
int age;
float score;
};
int main()
{
struct Stu s = { "zhangsan",18,99.5 };
FILE* pf = fopen("test.txt", "w");
if (NULL == pf)
{
perror("fopen");
return 1;
}
fprintf(pf, "%s %d %f", s.name, s.age, s.score);
fclose(pf);
pf = NULL;
return 0;
}
int fscanf ( FILE * stream, const char * format, ... );
例子
struct Stu
{
char name[20];
int age;
float score;
};
int main()
{
struct Stu s = { 0 };
FILE* pf = fopen("test.txt", "r");
if (NULL == pf)
{
perror("fopen");
return 1;
}
fscanf(pf, "%s %d %f", s.name, &s.age, &s.score);
printf("%s %d %f", s.name, s.age, s.score);
return 0;
}
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
例子
struct Stu
{
char name[20];
int age;
float score;
};
int main()
{
FILE* pf = fopen("test.txt", "wb");//前面的函数读写文件都是文本信息,都可以看懂
//fread和fwrite读写文件都是二进制信息
if (NULL == pf)
{
perror("fopen");
return 1;
}
struct Stu s = { "zhangsan",20,99.5 };
fwrite(&s, sizeof(struct Stu), 1, pf);
fclose(pf);
pf = NULL;
return 0;
}
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
例子
struct Stu
{
char name[20];
int age;
float score;
};
int main()
{
FILE* pf = fopen("test.txt", "rb");
if (NULL == pf)
{
perror("fopen");
return 1;
}
struct Stu s = { 0 };
fread(&s, sizeof(struct Stu), 1, pf);
printf("%s %d %f", s.name, s.age, s.score);
fclose(pf);
pf = NULL;
return 0;
}
功能 | 函数名 | 适用于 |
---|---|---|
字符输入函数 | fgetc | 所有输入流 |
字符输出函数 | fputc | 所有输出流 |
文本行输入函数 | fgets | 所有输入流 |
文本行输出函数 | fputs | 所有输出流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输出流 |
二进制输入 | fread | 文件 |
二进制输出 | fwrite | 文件 |
例子
struct Stu
{
char name[20];
int age;
float score;
};
int main()
{
struct Stu s = { "zhangsan",18,99.5 };
char buf[100] = { 0 };
sprintf(buf, "%s %d %f", s.name, s.age, s.score);
printf("%s\n", buf);
printf("-------分割线---------\n");
struct Stu tmp = { 0 };
sscanf(buf, "%s %d %f", tmp.name, &tmp.age, &tmp.score);
printf("%s %d %f", tmp.name, tmp.age, tmp.score);
return 0;
}
int fseek ( FILE * stream, long int offset, int origin );
例子
int main()
{
FILE* pf = fopen("test.txt", "r");//先在文件内写好abcdef,现在用读的形式打开
if (NULL == pf)
{
perror("fopen");
return 1;
}
//文件的顺序读写,读完一个字符后,文件指针指向下一个字符
printf("%c\n", fgetc(pf));//a
printf("%c\n", fgetc(pf));//b
printf("%c\n", fgetc(pf));//c
//按照顺序读写,接下来打印的是d,但我想要打印b
fseek(pf, -2, SEEK_CUR);//当前位置是文件指针(位置指示器)指向d,后前偏移2就指向b
printf("%c\n", fgetc(pf));
//法2: fseek(pf,1,SEEK_SET);从开头开始偏移
// printf("%c\n",fgetc(pf));
//法3: fseek(pf,-4,SEEK_END);//从末尾开始偏移
// printf("%c\n", fgetc(pf));
fclose(pf);
pf = NULL;
return 0;
}
long int ftell ( FILE * stream );
例子
int main()
{
FILE* pf = fopen("test.txt", "r");
if (NULL == pf)
{
perror("fopen");
return 1;
}
printf("%c\n", fgetc(pf));//a
printf("%c\n", fgetc(pf));//b
printf("%d\n", ftell(pf));
return 0;
}
void rewind ( FILE * stream );
例子
int main()
{
FILE* pf = fopen("test.txt", "r");
if (NULL == pf)
{
perror("fopen");
return 1;
}
printf("%c\n", fgetc(pf));//a
printf("%c\n", fgetc(pf));//b
printf("%d\n", ftell(pf));//2
rewind(pf);
printf("%c\n", fgetc(pf));//a
return 0;
}
例子
int main(void)
{
int c; // 注意:int,非char,要求处理EOF
FILE* fp = fopen("test.txt", "r");
if(!fp) {
perror("File opening failed");
return EXIT_FAILURE;
}
//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环
{
putchar(c);
}
//判断是什么原因结束的
if (ferror(fp))
puts("I/O error when reading");
else if (feof(fp))
puts("End of file reached successfully");
fclose(fp);
}