类型转换
这一周差不多都在做一件事情,也是第一次跟着老师。没想到自己的反应会这么慢,基础更是差的不能提。下面代码吧。
#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;
}
最后
在这里面很感谢两个网友:一个是随想,另一个就是小冬冬。随想是让自己问的实在是没有办法解释了,很无奈对自己说,好好看书吧,可是数据又确实没有。
小冬冬,一直的很耐心的说,只是好像走偏了。这样一来,就让自己进入了一个死胡同里面。
也不能否定自己的基础是何等的差。两个人都是被自己问到说真的不能帮自己了,呵呵!是不是自己太钻了。

浙公网安备 33010602011771号