1.copy file
#include <stdio.h>
#include <stdlib.h>
#define SIZE 200
int main(void) {
const char* file_name = "E:\\桌面\\file.txt";
const char* copy_name = "E:\\桌面\\copy.txt";
const char* fuck_name = "E:\\桌面\\fuck.txt";
FILE* file_ptr, * copy_ptr, * fuck_ptr;
errno_t ef = fopen_s(&file_ptr, file_name, "rb");
if (ef != 0 || file_ptr == NULL) {
perror("file opening failed!");
return EXIT_FAILURE;
}
errno_t ec = fopen_s(©_ptr, copy_name, "wb");
if (ec != 0 || copy_ptr == NULL) {
perror("copy opening failed!");
return EXIT_FAILURE;
}
errno_t ek = fopen_s(&fuck_ptr, fuck_name, "wb");
if (ek != 0 || fuck_ptr == NULL) {
perror("fuck opening failed!");
return EXIT_FAILURE;
}
size_t read_bytes;
char buffer[SIZE];
while( (read_bytes = fread(buffer, 1, sizeof(buffer), file_ptr)) > 0) {
fwrite(buffer, 1, read_bytes, copy_ptr);
fwrite(buffer, 1, read_bytes, fuck_ptr);
}
puts("copy successfully!");
fclose(file_ptr);
fclose(copy_ptr);
fclose(fuck_ptr);
return 0;
}
2.output
copy successfully!
file:
3.易错写法
3.1 read_bytes没有一直更新:
while( read_bytes > 0) {
fwrite(buffer, 1, read_bytes, copy_ptr);
fwrite(buffer, 1, read_bytes, fuck_ptr);
}
3.2 没有按顺序关闭文件流:
_fcloseall();
另外,fclose 单独关闭,便于后续错误排查
4.两种写法的不同之处
实际上是2种适用场景:
4.1 二进制文件处理:(字节为单位)
"rb"
"wb"
可以表示任何类型的数据
数据按原始的字节处理,不进行任何转换
while((read_bytes = fread(buffer, 1, sizeof(buffer), file_ptr)) > 0) {
fwrite(buffer, 1, read_bytes, copy_ptr);
fwrite(buffer, 1, read_bytes, fuck_ptr);
}
4.2 文本文件处理:(字符为基础)
会处理字符编码和换行符,文件结尾添加 \0 表示字符串结束
while((read_bytes = fread(buffer, 1, sizeof(buffer) - 1, file_ptr)) > 0) {
buffer[read_bytes] = '\0';
fwrite(buffer, 1, read_bytes, copy_ptr);
fwrite(buffer, 1, read_bytes, fuck_ptr);
}
5.出现的错误类型:
打开的路径(fopen_s 的第2个参数)写错会出现:
Permission denied