利用C语言,进行文件读写
读文件,写文件
#include <stdio.h>
#include <stdlib.h>
//将array_read指向的data_length个元素存储到path对应的路径中
int read_raw_hex_data(char path[], int data_length, double array_read[]) {
FILE* fpRead = NULL;
int i = 0;
fopen_s(&fpRead, path, "r");
if (fpRead == NULL)
{
printf("Fail to read raw data file!");
return -1;
}
for (i = 0; i < data_length; i++)
{
fscanf_s(fpRead, "%lf", &array_read[i]);
}
fclose(fpRead);
return 0;
}
//将array_read指向的data_length个元素存储到path对应的路径中
int save_data(char path[], int data_length, double array_write[]) {
FILE* fpWrite = NULL;
int i = 0;
fopen_s(&fpWrite, path, "w");
if (fpWrite == NULL)
{
printf("Failed to save data!");
exit(1);
}
for (i = 0; i < data_length; i++) {
fprintf(fpWrite, "%.20lf ", array_write[i]);
if ((i + 1) % 5 == 0)fprintf(fpWrite, "\n");
}
fclose(fpWrite);
return 0;
}
int main() {
double a[20];
int data_length = 20;
char path[40] = "./data_file/1.txt";
for (int i = 0; i < 20; i++)
a[i] = i*2.5+1e-18;
save_data(path, data_length, a);
read_raw_hex_data(path, data_length, a);
for (int i = 0; i < 20; i++) {
printf("%.20lf ",a[i]);
if ((i + 1) % 5 == 0)printf("\n");
}
return 0;
}
BMP图片格式简单梳理
经查阅资料,选择BPM(bitmap)格式,C语言可以直接打开,头文件在#include<stdio.h>
Q3怎么提取像素值,获得所需实验图片数据
C语言实现对BMP文件的单通道图像以及灰度图提取 - 王敬斯 - 博客园
此链接而文档的数据是我初始编写读取bmp文件代码的主要参考链接,以至于误导我在完成加密后获得的灰度图像后,读取灰度图像时仍然采用fseek(fp, sizeof(RGBQUAD), 1);语句而没有及时改为fread(pColorTable11, sizeof(RGBQUAD), 256, fp);,我曾进行多次排查错误,找了好几天,最后终于发现是这里出现问题,再次检查加密算法,尝试对每一个像素点进行简单的处理,如都与1异或(结果图片加密解密后变化不大),我又试图每个像素点依次对1,2,3,…,255,1,2,3,…,255,1循环,发现图像加密后有变化了,但是解密无法复原,多次进行发现仍然是这个结果,图片的含义就是对应英文意思,上图是我已经找到出错点,那就是没有后的运行结果图,成也萧何,败也萧何,我打印输出中间的运行结果,发现确实对不上,如上图。
最后,怎么想到解决这个问题的,没办法了,去再找资料,看视频,可是视频里也没说要怎么读灰度图像,只是偶然在一个视频里看到这个
于是,我想,可能这里有问题,调色板不是必须的吗,至少对于灰度图像,那我在写的时候就不写这个调色板,我看看我的数据是否出现错误,这下不出现错误了,如下图
不过,由于没有调色板,在windows下看不到我加密后的图片了,应该是格式无法解析。。。
我再次看视频,找链接,找错误,这次我认准了,哪里都没有出错,就是读文件读得不对,下面的链接再次进入我的视野https://blog.csdn.net/weixin_32469089/article/details/117142339?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165734166716781435411776%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=165734166716781435411776&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~pc_rank_34-3-117142339-null-null.142^v32^pc_rank_34,185^v2^control&utm_term=c%E8%AF%AD%E8%A8%80bmp%E5%A4%84%E7%90%86&spm=1018.2226.3001.4187
起初找图片资料的时候,我也找了这个网站,由于只有代码,没有图片,我没有用,也没有细看,这次我看到读取的不正是我要的灰度图像吗,我马上看了看前面的代码,找到那句话,应用到我的代码里,成功了,问题解决。
记住:8bit灰度图片需要调色板,存储的时候和读取的时候都要。
Q4对于问题三中的图像素材,由于网站里大部分都有水印,在下面的网址里找到了素材original image: Lena
打开图片,另存为设置为bmp文件即可
起初,我是先用彩色图片转化为灰度图片,对于得到的灰色图片,进行加密解密处理,实际可以直接对灰色图片加密解密处理
结构体对齐规则