标准IO
1、文件操作
1.1 打开文件——fopen()、freopen()
FILE *fopen(const char *pathname, const char *mode);
功能:打开文件,并且生成一个流
返回值:成功返回值流指针,失败返回NULL
参数说明:
pathname:文件名(包含路径)
mode:打开文件的方式(必须指定读写)
r:只读方式打开
r+:读写
w:文件存在则清空,文件不存在则创建。只写
w+:文件存在则清空,文件不存在则创建,读写
a:文件存在则在末尾进行写入,不存在则创建
a+:文件存在则在末尾近些写入,不存在则创建,还可以读
注:任何流刚生成时,不会开辟缓冲区,只有在读或者写时才会马上开辟缓冲区
#include
int main() {
FILE *file;
file = fopen("example.txt", "w");
if (file != NULL) {
fprintf(file, "Hello, World!\n");
fclose(file);
printf("File opened and written successfully.\n");
} else {
printf("Failed to open the file.\n");
}
return 0;
}
FILE *freopen(const char *pathname, const char *mode, FILE *stream);
功能:重定向一个流,用pathname打开的文件生成的流来替代stream原本的流
返回值:成功返回流指针,失败返回NULL
参数说明:
pathname:文件名(包含路径)
mode:打开文件的方式(必须指定读写)
r:只读方式打开
r+:读写
w:文件存在则清空,文件不存在则创建。只写
w+:文件存在则清空,文件不存在则创建,读写
a:文件存在则在末尾进行写入,不存在则创建
a+:文件存在则在末尾近些写入,不存在则创建,还可以读
stream:要替换的流
#include
int main(int argc, char *argv[])
{
FILE* fp = freopen("xxx", "r+",stdout);
if(fp == NULL){
return -1;
}
printf("hello world\n");
return 0;
}
1.2 读写文件——fgetc()、fputc()、fgets()、fputs()、fread()、fwrite()、
①按字节读写——fgetc()、fputc()
int fgetc(FILE *stream);
功能:从流里面读取一个字符
返回值:成功返回实际读到的字符,失败返回-1
参数说明:
stream:要读取的流
int fputc(int c, FILE *stream);
功能:往流里面写入一个字符
返回值:成功返回实际写入的字符,失败返回-1
参数说明:
c:要写的内容
stream:要写入的流
#include
int main() {
FILE *file;
int ch;
file = fopen("example.txt", "r");
if (file != NULL) {
while ((ch = fgetc(file)) != EOF) {
putchar(ch);
}
fclose(file);
} else {
printf("Failed to open the file.\n");
}
return 0;
}
fgtec()和fputc()实现copy功能
#include
#include
int main(int argc, char *argv[])
{
FILE *fb,*fd;
if(argc != 3){
printf("%s \n", argv[0]);
}
fb = fopen(argv[1],"r");
if(fb == NULL){
perror("open fb:");
return -1;
}
fd = fopen(argv[2],"w+");
if(fd == NULL){
perror("poen fd:");
return -1;
}
char buf[64];
while(fgets(buf,sizeof(buf),fb) != NULL){
fputs(buf, fd);
}
fclose(fb);
fclose(fd);
return 0;
}
②按行读写——fgets()、fputs()
char *fgets(char *s, int size, FILE *stream);
功能:目标是读取一行内容
返回值:成功返回字符串首地址,失败返回NULL
参数说明:
s:用于存放读取到的字符串的缓冲区
size:预计要读多少个字节
stream:要读的流
注:fgets会读size-1个字节,如果在这个范围内读到了换行,
那么在后面添加一个'\0'然后结束函数。如果没读到换行,
会读取size-1个数据然后添加一个'\0'结束函数
int fputs(const char *s, FILE *stream);
功能:往流里面写入一串数据
返回值:成功返回1,失败返回-1
参数说明:
s:要写入的内容所在的缓冲区
stream:要写入的流
#include
int main() {
FILE *file;
char buffer[100];
file = fopen("example.txt", "r");
if (file != NULL) {
while (fgets(buffer, sizeof(buffer), file) != NULL) {
printf("%s", buffer);
}
fclose(file);
} else {
printf("Failed to open the file.\n");
}
return 0;
}
#include
#include
int main(int argc, char *argv[])
{
FILE* fp = fopen("xxx","r");
if(fp == NULL){
perror("fopen:");
return -1;
}
char buf[64] = {0};
memset(buf, '#', sizeof(buf));
fgets(buf, 5, fp);
for(int i = 0; i < 64; i++){
printf("%c", buf[i]);
}
printf("\n");
return 0;
}
③按对象读写——fread()、fwrite()、
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从流里面读取nmemb个对象的数据
返回值:成功返回实际读到对象数,失败返回0
参数说明:
ptr:要保存内容的缓冲区地址
size:每个对象的字节大小
nmemb:预计要读多少个对象
stream:要读的流
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:往流里面写入nmemb个对象的数据
返回值:成功返回实际写入的对象数,失败返回0
参数说明:
ptr:保存要写入的数据的缓冲区
size:每个对象的字节大小
nmemb:预计要写多少个对象
stream:要写的流
#include
struct Student {
char name[50];
int age;
};
int main() {
FILE *file;
struct Student student;
file = fopen("example.dat", "wb");
if (file != NULL) {
student.age = 20;
fwrite(&student, sizeof(struct Student), 1, file);
fclose(file);
printf("Student data written successfully.\n");
} else {
printf("Failed to open the file.\n");
}
return 0;
}
1.3 文件定位——fseek()
int fseek(FILE *stream, long offset, int whence);
功能:改变文件内的定位
返回值:成功返回0,失败返回-1
参数说明:
stream:要操作的流
offset:偏移量,正数往后偏移,负数往前偏移
whence:基准点
SEEK_SET:文件头
SEEK_CUR:文件当前定位
SEEK_END:文件尾
#include
int main() {
FILE *file;
char ch;
file = fopen("example.txt", "r");
if (file != NULL) {
fseek(file, 5, SEEK_SET);
ch = fgetc(file);
printf("Character at position 5: %c\n", ch);
fclose(file);
} else {
printf("Failed to open the file.\n");
}
return 0;
}
2.目录流——opendir()、readdir()
#include
DIR *opendir(const char *name);
功能:打开一个文件夹,生成一个目录流
返回值:成功返回流指针,失败返回NULL
参数说明:
name:要打开的文件夹
读文件——readdir()
struct dirent *readdir(DIR *dirp);
功能:读取一个文件,从打开的文件夹里面读
返回值:成功返回结构体指针,失败返回NULL
参数说明:
dirp:打开的目录流
#include
#include
int main() {
DIR *dir;
struct dirent *entry;
dir = opendir(".");
if (dir != NULL) {
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
closedir(dir);
} else {
printf("Failed to open the directory.\n");
}
return 0;
}