目录
文件管理
当启动一个程序时,系统会打开3个设备文件(stdin(标准输入文件(键盘)))、(stdout(标准输出文件(终端(屏幕))))、stderr(标准错误文件(终端(屏幕))));
fopen
在C语言中,fopen
是一个用于打开文件的标准库函数,它的声明在 <stdio.h>
头文件中。fopen
函数提供了一种在程序中访问文件的方法,可以用于读取文件内容、写入新内容或者进行文件的其他操作。
perror
perror
是一个标准库函数,用于打印上一个发生的错误信息。它通常用于在程序出现错误时输出与 errno
相关的错误消息,方便程序员进行调试和错误处理。
fputc
#include <stdio.h>
#include <stdlib.h>
#define FILENAME "./记录文件.txt"
FILE *open_file(char *mode)
{
FILE *fp = fopen(FILENAME, mode); // 使用宏定义 FILENAME 作为文件名
if (!fp)
{
perror("打开失败"); // 打印错误信息
exit(1); // 退出程序
}
return fp; // 返回文件指针
}
int main()
{
FILE *fp = open_file("w"); // 使用 "w" 模式打开文件
if (fputc('A', fp) == EOF) {
perror("写入失败");
return 1;
}
printf("字符写入成功\n");
fclose(fp); // 关闭文件
return 0;
}
fgetc
把字符串hello world写入记录文件.txt中
#include <stdio.h>
#include <stdlib.h>
#define FILENAME "./记录文件.txt"
FILE *open_file(char *mode)
{
FILE *fp = fopen(FILENAME, mode); // 使用宏定义 FILENAME 作为文件名
if (!fp)
{
perror("打开失败"); // 打印错误信息
exit(1); // 退出程序
}
return fp; // 返回文件指针
}
int main()
{
FILE *fp = open_file("w"); // 使用 "w" 模式打开文件
char str[] = "hello world\n";
int i = 0;
while (str[i] != 0)
{
fputc(str[i++], fp);
}
fclose(fp); // 关闭文件
return 0;
}
从记录文件.txt中,把字符串hello world读出
#include <stdio.h>
#include <stdlib.h>
#define FILENAME "./记录文件.txt"
FILE *open_file(char *mode)
{
FILE *fp = fopen(FILENAME, mode); // 使用宏定义 FILENAME 作为文件名
if (!fp)
{
perror("打开失败"); // 打印错误信息
exit(1); // 退出程序
}
return fp; // 返回文件指针
}
int main()
{
FILE *fp = open_file("r"); // 使用 "r" 模式打开文件
char str[128] = "";
int i = 0;
while ((str[i++] = fgetc(fp)) != EOF);
printf("%s",str);
fclose(fp); // 关闭文件
return 0;
}
还可以读取二进制文件
#include <stdio.h>
#include <stdlib.h>
FILE *open_file(char *filename, char *mode)
{
FILE *fp = fopen(filename, mode);
if (!fp)
{
perror("打开失败");
exit(1);
}
return fp;
}
int main()
{
FILE *fp = open_file("./原图片.png", "rb");
FILE *fp1 = open_file("./新图片.png", "wb");
char ch;
while (1)
{
ch = fgetc(fp);
if(feof(fp))
break;
fputc(ch, fp1);
}
fclose(fp); // 关闭文件
fclose(fp1);
return 0;
}
原图片
新图片
feof
#include <stdio.h>
#include <stdlib.h>
#define FILENAME "./记录文件.txt"
FILE *open_file(char *mode)
{
FILE *fp = fopen(FILENAME, mode); // 使用宏定义 FILENAME 作为文件名
if (!fp)
{
perror("打开失败"); // 打印错误信息
exit(1); // 退出程序
}
return fp; // 返回文件指针
}
int main()
{
FILE *fp = open_file("r"); // 使用 "r" 模式打开文件
char str[128] = "";
int i = 0;
do{
str[i++] = fgetc(fp);
}while (!feof(fp));
printf("%s",str);
fclose(fp); // 关闭文件
return 0;
}
fgets
fgets
函数用于从文件中读取一行文本
char *fgets(char *str, int n, FILE *stream);
fgets
函数会从 stream
中读取字符,直到遇到换行符 \n
、文件结尾 EOF
或者读取了 n-1
个字符(视先达到哪个条件而定),然后将读取的内容存储在 str
中,并在末尾添加空字符 \0
。如果成功读取到内容,返回 str
;如果遇到错误或者读取到文件结尾,返回 NULL
。
#include <stdio.h>
#include <stdlib.h>
FILE *open_file(char *filename, char *mode)
{
FILE *fp = fopen(filename, mode);
if (!fp)
{
perror("打开失败");
exit(1);
}
return fp;
}
int main()
{
FILE *fp = open_file("./记录文件.txt", "r");
char buf[1024] = "";
fgets(buf, sizeof(buf), fp);
printf("%s",buf);
fclose(fp); // 关闭文件
return 0;
}
fputs
fputs
函数用于向文件中写入字符串
int fputs(const char *str, FILE *stream);
fputs
函数会将 str
指向的字符串写入到 stream
指定的文件中,直到遇到空字符 \0
。成功时返回非负数,出错时返回 EOF
。
#include <stdio.h>
#include <stdlib.h>
FILE *open_file(char *filename, char *mode)
{
FILE *fp = fopen(filename, mode);
if (!fp)
{
perror("打开失败");
exit(1);
}
return fp;
}
int main()
{
FILE *fp = open_file("./记录文件.txt", "w");
char buf[1024] = "abcdefg";
fputs(buf, fp);
fclose(fp); // 关闭文件
return 0;
}
fprintf
fprintf
是 C 标准库中用于格式化输出到文件的函数,其功能类似于 printf
函数,但是可以指定输出到一个文件流中。
int fprintf(FILE *stream, const char *format, ...);
#include <stdio.h>
#include <stdlib.h>
FILE *open_file(char *filename, char *mode)
{
FILE *fp = fopen(filename, mode);
if (!fp)
{
perror("打开失败");
exit(1);
}
return fp;
}
int main()
{
char name[] = "John";
int age = 30;
FILE *fp = open_file("./记录文件.txt", "w");
fprintf(fp, "Name: %s\nAge: %d\n", name, age); // 输出到文件
fclose(fp); // 关闭文件
return 0;
}
fscanf
fscanf
是 C 标准库中用于从文件中读取格式化数据的函数,类似于 scanf
函数,但是可以从指定的文件流中读取输入数据。
int fscanf(FILE *stream, const char *format, ...);
#include <stdio.h>
#include <stdlib.h>
FILE *open_file(char *filename, char *mode)
{
FILE *fp = fopen(filename, mode);
if (!fp)
{
perror("打开失败");
exit(1);
}
return fp;
}
int main()
{
char name[128] = "";
int age = 0;
FILE *fp = open_file("./记录文件.txt", "r");
// 从文件中读取数据
fscanf(fp, "Name: %s\nAge: %d\n", name, &age);
printf("Name: %s\n", name); // 输出读取到的数据
printf("Age: %d\n", age);
fclose(fp); // 关闭文件
return 0;
}
fwrite
fwrite
是 C 标准库中用于将数据块写入文件的函数。它允许你指定要写入的数据块的大小、数量和目标文件流,是一个高效的二进制数据输出函数。
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
#include <stdio.h>
#include <stdlib.h>
typedef struct std
{
char name[16];
int age;
}STD;
FILE *open_file(char *filename, char *mode)
{
FILE *fp = fopen(filename, mode);
if (!fp)
{
perror("打开失败");
exit(1);
}
return fp;
}
int main()
{
STD name[3] = {{"as",18},{"bs",20},{"cs",25}};
FILE *fp = open_file("./记录文件.txt", "w");
int count = fwrite(name,1,sizeof(name),fp);
printf("count: %d\n", count);
fclose(fp); // 关闭文件
return 0;
}
fread
fread
是 C 标准库中用于从文件中读取数据块的函数,与 fwrite
相对应。它允许你从文件中读取指定大小和数量的数据块,并将其存储到内存中的指定位置。
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct std
{
char name[16];
int age;
}STD;
FILE *open_file(char *filename, char *mode)
{
FILE *fp = fopen(filename, mode);
if (!fp)
{
perror("打开失败");
exit(1);
}
return fp;
}
int main()
{
STD name[3];
memset(name,0,sizeof(name));
FILE *fp = open_file("./记录文件.txt", "r");
for(int i = 0; i < 3; i ++)
{
int count = fread(&name[i],1,sizeof(STD),fp);
printf("count: %d\n", count);
printf("name:%s\tage:%d\n", (&name[i])->name,name[i].age);
}
fclose(fp); // 关闭文件
return 0;
}
fseek
移动光标
ftell
ftell
是 C 标准库中的一个函数,用于获取文件流的当前位置(即文件指针的偏移量)。它的原型定义在 <stdio.h>
头文件中。
long int ftell(FILE *stream);
ftell
返回的位置是从文件开头到当前文件指针位置的字节数。对于二进制文件,这通常是文件中的实际字节数;对于文本文件,由于可能存在换行符等特殊字符,返回的字节数可能不是预期的行数。
struct stat
struct stat
是一个用于描述文件状态的结构体,通常在 UNIX/Linux 系统上用于获取文件的详细信息。它定义在 <sys/stat.h>
头文件中。
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for filesystem I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
结构体成员解释
st_dev
: 包含文件的设备 ID。st_ino
: 文件的 inode 号码。st_mode
: 文件的权限和类型(比如普通文件、目录等)。st_nlink
: 文件的硬链接数。st_uid
: 文件所有者的用户 ID。st_gid
: 文件所有者的组 ID。st_rdev
: 如果文件是特殊文件(比如设备文件),则包含设备 ID。st_size
: 文件的大小,以字节为单位。st_blksize
: 文件系统 I/O 的块大小。st_blocks
: 文件分配的块数,每块大小为 512 字节。st_atime
: 文件最后访问时间。st_mtime
: 文件最后修改时间。st_ctime
: 文件状态最后更改时间(比如权限更改)。
remove
在 C 语言中,remove()
函数是用来删除文件的标准库函数,其功能是将指定的文件从文件系统中删除。
int remove(const char *filename);
rename
在 C 语言中,rename()
函数用于重命名文件或者将文件移动到另一个位置。
更新缓存区
刷新缓冲区的方法,3种
a>缓冲区满
b>fflush函数强制刷新
c>程序正常退出
fflush
在 C 语言中,fflush()
函数用于刷新流的缓冲区,确保数据被写入到对应的文件或者设备中。
int fflush(FILE *stream);
stream
:指向 FILE
结构体的指针,表示要刷新的流。常见的流包括标准输入 stdin
、标准输出 stdout
和标准错误 stderr
,以及通过 fopen()
打开的文件流。