1.读取文本文件。
fopen 打开文件
fgets 读取文本文件
fputs 文件写入
fclose 关闭文本
fread 读。返回 读取到的字节数。
fwrite 写。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main(){
// 打开文件 (文件名,模式)mode: r(读) w(写) rb(作为二进制读) wb(作为二进制写)
// FILE *fopen( const char *filename, const char *mode );
// char* fileName = "C:\\Users\\hcDarren\\Desktop\\android\\NDK\\Simple.txt";
char* fileName = "C:\\Users\\Simple.txt";
FILE *file = fopen(fileName, "r"); // 打开文件,读。
if (!file){
printf("文件打开失败");
exit(0);// 退出程序
}
char buffer[10]; // 缓冲区
// 缓冲区buffer; 长度10; 文件指针
while (fgets(buffer, 10, file)) { // 未读取到文件尾,循环读取。
printf("%s", buffer);
}
fclose(file); // 关闭文件
// getchar();
}
// 文件写入
void main(){
char* fileName = "C:\\Users\\Simple_Write.txt";
FILE *file = fopen(fileName, "w");
if (!file){
printf("文件打开失败");
exit(0);// 退出程序
}
fputs("I am Darren", file);
// 关闭文件
fclose(file);
getchar();
}
2. 拷贝文件:当做的二进制文件来操作
文件复制:当做二进制文件来操作。
void main(){
char* fileName = "C:\\Users\\hcDarren\\Desktop\\android\\NDK\\image.jpg";
char* fileCopyName = "C:\\Users\\hcDarren\\Desktop\\android\\NDK\\image_copy.jpg";
FILE *file = fopen(fileName, "rb");// 二进制流的指针
FILE *file_copy = fopen(fileCopyName, "wb");// 新建一个文件 0kb
if (!file || !file_copy){
printf("文件打开失败");
exit(0);// 退出程序
}
// size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
int buffer[512]; // 缓冲大小:2048字节 = 4字节*512
int len;
printf("buffer size: %d", sizeof(buffer)); // sizeof(buffer)= sizeof buffer。值:2048
while ((len = fread(buffer, sizeof(int), 512, file)) !=0){ // 循环,一边读一边写。
fwrite(buffer, sizeof(int), len, file_copy); // 读取多少字节,写入多少字节。
}
fclose(file); // 关闭文件
fclose(file_copy);
getchar();
}
// 获取文件的大小:fseek,ftell
// 思路:将文件的指针移动到最后,然后再去计算偏移量,从而得到文件大小。
void main(){
char* fileName = "C:\\Users\\hcDarren\\Desktop\\android\\NDK\\image.jpg";
FILE *file = fopen(fileName, "rb");// 流指针,打开文件。
if (!file){
printf("文件打开失败");
exit(0);// 退出程序
}
// 没有一个函数是可以直接拿文件大小
// 思路:将文件的指针移动到最后,然后再去计算偏移量
// 三个参数: SEEK_SET(移动到开头), SEEK_CUR(移动到当前), SEEK_END(移动到最后)
fseek(file, 0, SEEK_END); // 1.将文件指针移动到哪里去。
// 2.计算偏移的位置, ftell 从 0开始统计到当前(SEEK_END文件末尾)
long file_size = ftell(file);
printf("文件大小:%ld", file_size);
fclose(file);
getchar();
}
3.文件加密与文件切割。
使用第三方文件服务器,上传速度快,为了防止图片泄密,采取对图片加密。
客户端显示的时候,先解密再显示。
思路:让别人打不开图片。
把每个字节都拿出来,对每个字节都处理;把某部分字节拿出来,进行处理。
字节+一个数5(解密的时候-5);字节异或^一个数5(解密的时候,同样的异或5)。
只修改前面一个字节。
// 加密
void main() {
char* fileInName= "C:\\NDK\\image.jpg";
char* fileOutName= "C:\\NDK\\image_en.jpg";
File* fpIn = fopen(fileInName, "rb");
File* fpOut = fopen(fileOutName, "wb");
if(!fpIn || !fpOut){
printf("文件打开失败");
exit(0); // 退出程序
}
int c;
while((c = fegtc(fpIn)) != EOF) {
fputc(c^5, fpOut);
}
fclose(fpIn);
fclose(fpOut);
}
// 解密
void main() {
char* fileEnName= "C:\\NDK\\image_en.jpg";
char* fileDeName= "C:\\NDK\\image_de.jpg";
File* fpIn = fopen(fileEnName, "rb"); // 返回file流的头指针。
File* fpOut = fopen(fileDeName, "wb"); // 创建新文件。
if(!fpIn || !fpOut){
printf("文件打开失败");
exit(0); // 退出程序
}
int c;
while((c = fegtc(fpIn)) != EOF) { // 读取一个字节
fputc(c^5, fpOut); // 解密后,写入1字节。
}
fclose(fpIn);
fclose(fpOut);
}
// 只修改一个字节。fputc(5, file); 会破坏文件,Mat矩阵可以操作。
值修改一个字节的方案行不通。
void main() {
char* fileEnName= "C:\\NDK\\image.jpg";
File* file = fopen(fileDeName, "wb");
fputc(5, file);
fclose(file);
}
// 定义字符串密码加密。
void main() {
char* fileName= "C:\\NDK\\image.jpg";
char* fileEnName= "C:\\NDK\\image_en.jpg";
char* passWord = "123456"; // 轮流进行异或操作
File* fp = fopen(fileName, "rb");
File* fpEn = fopen(fileEnName, "wb");
if(!fp || !fpEn){
printf("文件打开失败");
exit(0); // 退出程序
}
int c; //EOF(end of file)
int index=0;
int pwd_len = strlen(passWord);
while((c = fegtc(fp)) != EOF) {
fputc(c^ passWord[index % pwd_len], fpEn);
index++;
}
fclose(fp);
fclose(fpEn);
}
// 解密
void main() {
char* fileEnName= "C:\\NDK\\image_en.jpg"; // 已加密的文件
char* fileDeName= "C:\\NDK\\image_de.jpg"; // 解密后文件
char* passWord = "123456"; // 轮流进行异或操作
File* fpEn = fopen(fileEnName, "rb");
File* fpDe = fopen(fileDeName, "wb");
if(!fpEn || !fpDe){
printf("文件打开失败");
exit(0); // 退出程序
}
int c; //EOF(end of file)
int index=0;
int pwd_len = strlen(passWord);
while((c = fegtc(fpEn)) != EOF) {
fputc(c^ passWord[index % pwd_len], fpDe);
index++;
}
fclose(fpEn);
fclose(fpDe);
}
4.文件的切割, 思路类似断点下载
百度云,不是vip,不能上传 不大于4G的文件。
大文件:断点续传 + 文件切割(文件合并),
int getFileSize(char* fileName){ // 获取文件总大小
File* file = fopen(fileName, "rb");
if(!file) {
return 0;
}
fseek(file, 0, SEEK_END);
int fileSize = ftell(file);
fclose(file);
return fileSize;
}
void main() {
// 计算每个文件需要写入多少?
char* fileName= "C:\\NDK\\image.jpg";
FILE* file = fopen(fileName, "rb");
int file_size = getFileSize(fileName);
// 切多少,计算大小,指定文件名称。
int file_number = 3;
// char[]就是 char* fileName:image_1.jpg, image_2.jpg, image_3.jpg...
char** file_names = malloc(sizeof(char*) *file_number); // 二维数组开辟
int preFileSize = file_size/ file_number; // 每份的size
// 进行文件名称 赋值
for(int i=0; i<file_number, i++) {
file_names[i] = (char*)malloc(sizeof(char) *100); // 每个文件名开辟
sprintf(file_names[i], "C:\\NDK\\image_%d.jpg", i);// 格式化字符串到file_names[i]
printf("%s\n", file_names[i]);
}
for(int i=0; i<file_number; i++){
// 从源文件中,往切割文件中写入数据。0~4,4~8,8~13.
FILE* cur_file = fopen(file_names[i], "wb");
int start = i*preFileSize;
int end = (i+1)*preFileSize;
if(i == file_number-1) {
end = file_size;
}
// 从文件中间位置开始读取,然后写入到3个文件中。
for(int j=start; j<end; j++) {
// 从file中读, 写入到cur_file中。读一个字节写入一个字节。
fputc(fgetc(file), cur_file);
}
fclose(cur_file);
free(file_name[i]);
}
free(file_names);
fclose(file);
}
// TODO 合并,创建一个文件,不断写入到文件中。判断EOF。
// 将分割的文件,合并成新的全文件。创建一个文件,不断的往里面写,直到文件的EOF。
void main() {
char* fileName = "C:\\image_result.png";
FILE* file = fopen(fileName, "wb");
int file_number = 3;
// 将切割的文件,合并未一个图片。
char** file_names = (char**)malloc(sizeof(char*) * file_number);
// 进行复制
int i = 0;
for (; i < 3; i++)
{
file_names[i] = (char*)malloc(sizeof(char) * 100);
sprintf(file_names[i], "C:\\image_%d.jpg", i); // 文件名 C:\\image_1.jpg
printf("%s\n", file_names[i]);
FILE* file_part = fopen(file_names[i], "rb"); //
int c;// EOF end of file
while ((c = fgetc(file_part)) != EOF) {
fputc(c, file);
}
fclose(file_part);
free(file_names[i]);
}
fclose(file);
free(file_names);
}
提升用户体验。
// 二级指针。
Student* student = &student; // 可以看成一维数组
Student s = *student;
Student s = student[0]; // 获取指针第0个位置
网友评论