类型转换
这一周差不多都在做一件事情,也是第一次跟着老师。没想到自己的反应会这么慢,基础更是差的不能提。下面代码吧。
#include <stdio.h> #include <stdlib.h> #include <string.h> //使用memset typedef char BYTE; //1byte void main() { int i, j; /* 定义两个整型变量 */ FILE *fpBin, *fpTxt; /* 定义两个文件型指针变量 */ BYTE *data = (BYTE *)malloc(4); /* 定义字符指针,申请了一个指针,指向的内存为4字节,每个字符仍是占一个字节 * 对应的用完需要释放,释放需要用到free(data) *相当于char data[4]; */ if(NULL == (fpBin = fopen(".\\sample", "rb"))) /* 判断用fopen打开的文件流是否为空,fpopen("路径及所要打开的文件名","打开方式") * 在此为用二进制方式打开sample文件,并把读到地结果放到bpBin。 */ { printf("二进制文件打开失败!\n"); /* 如果文件为空无法读取,或者路径出错则弹出出错提示 */ return; } if(NULL == (fpTxt = fopen(".\\sample.txt", "w"))) /* 语句格式同上。意义:写入sample.txt数据,如果没有这个文件则会重新建立一个。*/ { printf("文本文件打开失败!\n"); /* 如果文件为空无法写入,或者路径出错则弹出出错提示 */ return; } for(i=0; i<400; i++) /* 控制外面的400行循环 */ { for(j=0; j<640; j++) /* 内重循环640行 */ { memset(data, 0, 4); /* *data进行初始化 */ fread(data, 1, 1, fpBin); /* 把fpBin里面的数据放到data里面 * 第一个参数是指要把读到的文件存放的地方 * 第二个是指这种类型在内存中占多少字节,如果不知道可以写sizeof(类型名) * 第三个是指一次读取的字节数 * 第四个是指从谁读取 */ itoa(*data, data, 10); /* 把*data里面的数据转换为十进制放入到data里面 * 第一个参数是要转换的数据,第二个参数要是存放数据的地址,第三个是要进行转换的进制 */ fwrite(data, 1, 4, fpTxt); /* 把读到的data里面的数据写入到fpTxt里面 * * 第一个参数是要写的数据地址 * 第二个参数是要读取的字节数,也就是每次要写的字节数 * 第三个是要读字节所占的内存空间的大小,也就是每次要对字节进行写入的次数 * 第四个是要把读出来的数据写到的地方 * 第二个参数和第三个参数的乘积就是要写入的位数 */ } *data = '\n'; /* 把数据*data后面补一个换行符也就是第640列的时候换到下一行 */ fwrite(data, 1, 1, fpTxt); /* 换回车换行符写到fpTxt里面 */ } fclose(fpBin); /* 关闭文件fpBin */ fclose(fpTxt); /* 关闭文件fpTxt */ free(data); /* 释放data*/ }
首先:第一行:他写的是typedef char BYTE; //1byte
BYTE *data = (BYTE*)malloc(4);
我觉得没有必要,明明一句就可以得来的,什么要分两句写呢,然后就问了一下别人。才知道,是考虑到程序的可移值性,不同平台之间所分配的空间可能不一样。这样一来比较容易移植。顺便让我看了一下匈牙利命名法。
然后:malloc这个函数指向系统申请分配指定长度字节的内存空间…表面上一看能理解,其实不是我想的那样,因为我表达的类型是不是致的,思考就错了。分配的空间是连续的。而这里指的是一个变量所占的连续空间。
后来问的另一种写法
Typedef doubleDWORD
DWORD *data1=( DWORD*)malloc(400*460*sizeof(DWORD))自己就不是很理解,我可以理解是分配连续全部的空间,但是为什么后面还要加一个长度?问张他说别人都这么写的,也不是很清楚。
不理解指针,重新的补了一下,还是觉得理解的不好,很浅。不是很明白他对内存的操作,不会调程序(不能没有把操作系统,组成原理,接口,系统结构联系起来,虽然现在不用,但是我需要慢慢的把它们全部的联系到一起。不然,以后还是会遇到更多的问题)
明白什么是指针,什么是指针变量。及一般的使用方法。
接着就是文件,发现自己的书开始就没有完全的看明白。
跟同学交流的时候,然后才觉得自己思考的方向不对。一直的深到内存里面,而现在自己还不能够把学到的知识很好的融在一起,何况是运行。也限制了自己对程序的思考,平日代码又看的少。跟张志伟交流的时候,是觉得他侧重应用,让我感觉自己的思考是错误的,因这自己却一直往类型里面钻。然后也浪费了好多的时间。
这个是我用自己的方法写的:整型二进制转为浮点二进制的程序
#include <stdio.h> #include <stdlib.h> int main() { int a[400][640]; double b; FILE *fp1,*fp2; if((fp1=fopen("sample","rb"))==NULL) { printf("Error!\n"); } if((fp2=fopen("sample2","wb"))==NULL) { printf("Error!\n"); } fread(a,1,400*640,fp1); /* fp1的内容读到数组a 里面 */ for(int i=0;i<400;i++) { for(int j=0;j<640;j++) { b=a[i][j]; /* 把a中的数据赋到b 里面 */ fwrite(&b,4,1,fp2); /* 把数组b把内容写到fp2里面*/ } } fclose(fp1); fclose(fp2); system("pause"); return 0; } 这个是用张的方法写的: #include <stdio.h> #include <stdlib.h> #include <string.h> //用函数memset typedef char BYTE; typedef float DWORD; int main() { int i,j; BYTE *data=(BYTE *)malloc(400*640); DWORD *data1=(DWORD *)malloc(400*640*sizeof(DWORD)); // DWORD *data1=(DWORD *)malloc(400*640); //这什么删了sizeof后面就不行。? FILE *fp1,*fp2; if((fp1=fopen("sample","rb"))==NULL) { printf("error!\n"); return 0; } if((fp2=fopen("sample1","wb"))==NULL) { printf("Error!\n"); return 0; } memset(data,0,400*640); // 清楚内存 memset(data1,0,400*640*sizeof(DWORD)); // memset(data1,0,400*640); fread(data,sizeof(BYTE),400*640,fp1); /* 把fp1的文件读到data里面 */ itoa() for(i=0;i<400;i++) { for(j=0;j<640;j++) { data1[i*640+j]=data[i*640+j]; } } fwrite(data1,sizeof(DWORD),400*640,fp2); /* 把data1的数据写到fp2里面 */ fclose(fp1); fclose(fp2); free(data); free(data1); return 0; }
最后
在这里面很感谢两个网友:一个是随想,另一个就是小冬冬。随想是让自己问的实在是没有办法解释了,很无奈对自己说,好好看书吧,可是数据又确实没有。
小冬冬,一直的很耐心的说,只是好像走偏了。这样一来,就让自己进入了一个死胡同里面。
也不能否定自己的基础是何等的差。两个人都是被自己问到说真的不能帮自己了,呵呵!是不是自己太钻了。