r+ w+ r w a a+的区别
"r"(只读)
文件必须存在,否则fopen将失败。
只能从文件中读取数据,不能写入数据。
文件指针指向文件的开始位置。
"w"(只写,清空)
如果文件存在,其内容会被清空(即删除现有内容),即使文件没有被截断,也会变成一个空文件。
如果文件不存在,会创建一个新文件。
只能向文件写入数据,不能读取数据。
文件指针指向文件的开始位置。
"a"(追加)
如果文件存在,不会清空文件内容,而是将文件指针置于文件的末尾,准备在文件的末尾追加数据。
如果文件不存在,会创建一个新文件。
只能向文件写入数据,不能读取数据。
"r+"(读写)
文件必须存在,否则fopen将失败。
可以从文件中读取数据,也可以向文件写入数据。
文件指针指向文件的开始位置。
"w+"(读写,清空)
如果文件存在,其内容会被清空(即删除现有内容),即使文件没有被截断,也会变成一个空文件。
如果文件不存在,会创建一个新文件。
可以从文件中读取数据,也可以向文件写入数据。
文件指针指向文件的开始位置。
"a+"(读写,追加)
如果文件存在,不会清空文件内容,而是将文件指针置于文件的末尾,准备在文件的末尾追加数据。
如果文件不存在,会创建一个新文件。
可以从文件中读取数据,也可以向文件写入数据。
文件指针最初指向文件的末尾。
总结:
"r" 和 "r+" 允许读取,但"r"不允许写入,而"r+"允许读写。
"w" 和 "w+" 清空文件内容(或创建新文件),但"w"只允许写入,而"w+"允许读写。
"a" 和 "a+" 都是在文件末尾追加,但"a"只允许写入,而"a+"允许读写。
选择正确的模式对于避免数据丢失和确保数据正确读写至关重要。例如,如果你想在一个文件的末
1.fopen
功能:打开一个文件或创建一个新的文件
返回值:如果成功,返回指向FILE结构体的指针;如果失败,返回NULL。
函数原型 :FILE *fopen(const char *path, const char *mode);
示例:
FILE *fp = fopen("example.txt", "w");
2if (fp == NULL) {
3 perror("Error opening file");
4 exit(EXIT_FAILURE);
5}
2.fclose
功能:关闭一个已经打开的文件。
返回值:如果成功,返回0;如果失败,返回EOF(通常定义为-1)
函数原型 :int fputc(int c, FILE *stream);
示例:
fclose(fp);
3.fputc
功能:向文件写入一个字符。
返回值:如果成功,返回写入的字符;如果失败,返回EOF
函数原型 :int fputc(int c, FILE *stream);
示例:
fputc('H', fp);
4.fputs
功能:向文件写入一个字符串
返回值:如果成功,返回非零值;如果失败,返回EOF
函数原型 :int fputs(const char *s, FILE *stream);
示例:
fputs("hello World\n", fp);
5.fprintf
功能:格式化输入到文件。
返回值:如果成功,返回写入的字符数;如果失败,返回EOF。
函数原型 :int fprintf(FILE *stream, const char *format, ...);
示例:
fprintf(fp, "Hello, %s!\n", "World");
6.fgetc
功能:从文件读取一个字符。
返回值:如果成功,返回读取的字符;如果到达文件结尾或失败,返回EOF
函数原型 :int fgetc(FILE *stream);
示例:
int ch;
while ((ch = fgetc(fp)) != EOF) {
putchar(ch);
}
7.fgets
功能:从文件读取一行字符串
返回值:如果成功,返回指向字符串的指针;如果到达文件结尾或失败,返回NULL
函数原型 :char *fgets(char *s, int n, FILE *stream);
示例:
char str[100];
fgets(str, sizeof(str), fp);
puts(str);
8.fscanf
功能:从文件读取格式化的输入
返回值:如果成功,返回匹配成功的项目数;如果失败或文件结尾,返回EOF。
函数原型 :int fscanf(FILE *stream, const char *format, ...);
示例:
int number;
fscanf(fp, "%d", &number);
printf("Number read: %d\n", number);
9.fseek
功能:用于改变文件流的当前读写位置,即文件位置指针。
返回值:返回0表示成功,或者如果发生错误,则返回-1。
函数原型 :int fseek(FILE *stream, long offset, int whence);
stream:指向FILE类型的指针,表示你要操作的文件流。
offset:是一个long类型的值,表示相对于whence参数指定的起始点偏移多少字节。
whence:是一个整数,用于指定起始点。它可以是以下三个宏之一:
SEEK_SET:相对于文件的起始位置(即从文件开始处移动)。
SEEK_CUR:相对于当前文件位置(即从当前位置移动)。
SEEK_END:相对于文件的结束位置(即从文件末尾移动)。
示例:fseek(p, 0, SEEK_SET); //移动到起始位置
10.open
功能:函数用于打开或创建一个文件,并返回一个文件描述符,它是非负整数,用于后续的文件操作。
返回值:成功时返回一个非负整数的文件描述符;失败时返回 -1,并设置 errno。
函数原型 :
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
pathname: 文件路径名。
flags: 打开文件的模式,例如 O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_TRUNC 等。
mode: 只在 flags 包含 O_CREAT 时有效,用于指定新创建文件的权限。
使用示例
#include <fcntl.h>
2#include <sys/stat.h>
3
4int fd;
5fd = open("myfile.txt", O_RDWR | O_CREAT, 0644);
6if (fd == -1) {
7 perror("open");
8 exit(EXIT_FAILURE);
9}
11.write
功能:write 函数用于向一个打开的文件描述符写入数据。
返回值:成功时返回实际写入的字节数;如果返回 -1,则表示出错,可通过 errno 获取错误信息。
函数原型 :
#include <unistd.h>
2ssize_t write(int fd, const void *buf, size_t count);
使用示例
#include <unistd.h>
2
3ssize_t nwritten;
4char str[] = "Hello, World!";
5nwritten = write(fd, str, sizeof(str));
6if (nwritten == -1) {
7 perror("write");
8 exit(EXIT_FAILURE);
9}
12.read
功能:read 函数用于从一个打开的文件描述符读取数据
返回值:功时返回实际写入的字节数;如果返回 -1,则表示出错,可通过 errno 获取错误信息
函数原型 :
#include <unistd.h>
2ssize_t read(int fd, void *buf, size_t count);
参数:
fd: 文件描述符。
buf: 存放读取数据的缓冲区的指针。
count: 要读取的最大字节数。
使用示例
1#include <unistd.h>
2
3ssize_t nwritten;
4char str[] = "Hello, World!";
5nwritten = write(fd, str, sizeof(str));
6if (nwritten == -1) {
7 perror("write");
8 exit(EXIT_FAILURE);
9}