类型转换

这一周差不多都在做一件事情,也是第一次跟着老师。没想到自己的反应会这么慢,基础更是差的不能提。下面代码吧。

#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;
}

最后

在这里面很感谢两个网友:一个是随想,另一个就是小冬冬。随想是让自己问的实在是没有办法解释了,很无奈对自己说,好好看书吧,可是数据又确实没有。

小冬冬,一直的很耐心的说,只是好像走偏了。这样一来,就让自己进入了一个死胡同里面。

也不能否定自己的基础是何等的差。两个人都是被自己问到说真的不能帮自己了,呵呵!是不是自己太钻了。

原文地址:https://www.cnblogs.com/zerocc/p/1888125.html