一.文件中的路径
1.路径的概念:
文件在电脑中的位置(随便查看一个文件存储在你电脑上的位置,那个就是文件存储的绝对路径)
2.路径的两种表示方式
①:绝对路径:
以盘符(比如每台电脑都有的C盘)开始的路径
②:相对路径:
相对于当前项目而言的路径,并不是以盘符为开始的
3.转义字符
路径是以字符串的形式来进行表示的,但是不知道你有没有注意到一点,有些时候我们表示一个文件是:
"C:\project\myproject\test.txt"
但有些时候它的表示方式又是:
"C:\\project\\myproject\\test.txt"
为什么这两种一个会多一个'\'符号,在某种情况又不需要这个符号呢
其实\符号就是转义字符
转义字符有什么作用呢?
实际上,你是否注意过在C语言中如果我们要打一些特殊的字符,你是根本没办法打印的,比如如果我要打出双引号,怎么办?
这就需要我们用到转义字符了
#include<stdio.h>
int main() {
printf("\"");
}
那么聪明的你也一定想到了,为什么上方有些时候我们写路径会加上两个转义字符,有些时候又只需要一个
因为我们需要两个转义字符来让'\'这个字符正常表示,你可以试试能不能单打出一个'\'符号
#include<stdio.h>
int main() {
printf("\");
}
// 这个代码显然是错误的,因为转义字符把自己后方的那个双引号转义了
请读者自己运行下方的代码,更好地理解转义字符的含义
#include<stdio.h>
int main() {
char* file = "C:\\project\\myproject\\test.txt";
printf("%s\n", file);
}
二. 读取数据
1.书写步骤:
①:打开文件(fopen)
②:读数据(fgetc、fgets、fread)
③:关闭文件(fclose)
fgetc:
#include<stdio.h>
int main() {
// 以只读的方式打开下方的文件
FILE* file = fopen("D:\\桌面\\test\\file1.txt", "r");
int c;
// fgetc函数一次读取一个字节的数据,若读取不到,返回-1
while((c = fgetc(file)) != -1) {
printf("%c", c);
}
fclose(file);
}
fgets:
#include<stdio.h>
int main() {
// 以只读的方式打开下方的文件
FILE* file = fopen("D:\\桌面\\test\\file1.txt", "r");
// fgets函数一次读取一行的数据,若读取不到,返回null
char ans[1024];
// fgets的返回值也表示它读取到的数据
char* another_ans = fgets(ans, 1024, file);
printf("%s", another_ans);
fclose(file);
}
fgets循环遍历读取文件
#include<stdio.h>
int main() {
// 以只读的方式打开下方的文件
FILE* file = fopen("D:\\桌面\\test\\file1.txt", "r");
// fgets函数一次读取一行的数据,若读取不到,返回NULL
// fgets的返回值也表示它读取到的数据
char arr[1024];
char* ans;
while ((ans = fgets(arr, 1024, file)) != NULL) {
printf("%s", ans);
}
fclose(file);
}
fread循环遍历读取到的数据:
#include<stdio.h>
int main() {
// 以只读的方式打开下方的文件
FILE* file = fopen("D:\\桌面\\test\\file1.txt", "r");
// 在使用fread进行读取的时候,每次会尽可能地把数组给装满,并且返回当前读取到的有效字节个数,若没有有效数据,则返回0
char arr[1024];
// n表示fread函数读取到的有效字节个数
int n;
while ((n = fread(arr, 1, 1024, file)) != 0) {
// 如果不适用for循环一个字节一个字节地读取,一旦有一个数组没有装满就会出现乱码
for (int i = 0; i < n; i++)
printf("%c", arr[i]);
}
fclose(file);
}
2.文件的读写模式
(1).r:只读模式
(2).w:只写模式
若文件不存在则创建新文件
若文件已存在则清空文件
(3).a:追加写出模式
若文件不存在则创建新文件
若文件已存在则不清空文件,对其进行续写
(4).rb:只读模式(操作二进制文件)
(5).wb:只写模式(操作二进制文件)
若文件不存在则创建新文件
若文件已存在则清空文件
(6).ab:追加写出模式(操作二进制文件)
若文件不存在则创建新文件
若文件已存在则不清空文件,对其进行续写
三.写出数据
1.目的:
把程序中的数据写道本地文件中永久存储
2.书写步骤:
①:打开文件(fopen)
②:写入数据(fputc、fputs、fwrite)
③:关闭通道(fclose)
fputc:
#include<stdio.h>
int main() {
// 以只写的方式打开下方的文件
FILE* file = fopen("D:\\桌面\\test\\file1.txt", "w");
// fputc一次写一个字符,并且返回写出的字符
int c = fputc(97, file);
printf("%c", c);
fclose(file);
}
fputs:
#include<stdio.h>
int main() {
// 以只写的方式打开下方的文件
FILE* file = fopen("D:\\桌面\\test\\file1.txt", "w");
// fputs一次写一个字符串,写入成功则返回一个非负数
fputs("abcdefg", file);
fclose(file);
}
fwrite:
#include<stdio.h>
int main() {
// 以只写的方式打开下方的文件
FILE* file = fopen("D:\\桌面\\test\\file1.txt", "w");
// fwrite一次写入多个数据,返回写入数据的字节个数
char write[] = {97, 98, 99, 100, 101, 102, 103, 104, 105, 106};
int size = fwrite(write, 1, 10, file);
// 查看写入的字节个数
printf("%d", size);
fclose(file);
}
3.文件的读写模式
(1).r:只读模式
(2).w:只写模式
若文件不存在则创建新文件
若文件已存在则清空文件
(3).a:追加写出模式
若文件不存在则创建新文件
若文件已存在则不清空文件,对其进行续写
(4).rb:只读模式(操作二进制文件)
(5).wb:只写模式(操作二进制文件)
若文件不存在则创建新文件
若文件已存在则清空文件
(6).ab:追加写出模式(操作二进制文件)
若文件不存在则创建新文件
若文件已存在则不清空文件,对其进行续写
四.小练习,把一个文件中的内容拷贝到另一个文件中
#include<stdio.h>
int main() {
// 练习:拷贝文件
// 母文件
FILE* file1 = fopen("D:\\桌面\\test\\file1.txt", "rb");
// 子文件
FILE* file2 = fopen("D:\\桌面\\test\\file2.txt", "wb");
char arr[1024];
int size;
while ((size = fread(arr, 1, 1024, file1)) != 0) {
fwrite(arr, 1, size, file2);
}
fclose(file1);
fclose(file2);
}