您的位置:首页 > 运维架构 > Linux

一个程序,让你清楚区分二进制文件和文本文件

2016-03-06 10:58 633 查看
从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种。

  ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为:

ASC码  0011010100110110 00110111  00111000
 十进制码     5     6     7     8
这样的编码5678共占用4个字节。ASCII码文件可在屏幕上按字符显示, 例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。
由于是按字符显示,因此能读懂文件内容。

  二进制文件是按二进制的编码方式来存放文件的。 例如, 数5678的存储形式为: 00010110 00101110只占二个字节。二进制文件虽然也可在屏幕上显示, 但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。 输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。 因此也把这种文件称作“流式文件”。

 

 

#include <stdio.h>

#include <string.h>

#include <fcntl.h>

#include <unistd.h>

int main()

{

 int i;

 int len;

 FILE *out;

 unsigned char in_str[128];

 unsigned char string[] = {0xFF, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0xFF, 0x0};

 memset(in_str, 0, 128);

 len = strlen(string);

 out = fopen("Test", "w+");

 fwrite(string, sizeof(unsigned char), len, out);

 fclose(out);

 out = fopen("Test", "r+");

 fread(in_str, sizeof(unsigned char), len, out);

 for(i = 0; i < len; i++)

  printf("%x ", in_str[i]);

 fclose(out);

 printf("\n");

 

 

 {

  memset(in_str, 0, 128);

  int fd;

  fd = open("PText", O_CREAT|O_RDWR, 0666);

  write(fd, string, len);

  close(fd);

  

  fd = open("PText", O_RDWR);

  read(fd, in_str, len);

  for(i = 0; i < len; i++)

   printf("%x ", in_str[i]);

  close(fd);

  printf("\n"); 

 }

 

 {

  out = fopen("TTest", "w+");

  for(i = 0; i < len; i++){

   fprintf(out, "0x%x ", string[i]);

  }

  fclose(out);

  

  memset(in_str, 0, 128);

  out = fopen("TTest", "r+");

  for(i = 0; i < len; i++){

   fscanf(out, "%x", &in_str[i]);

  }

  for(i = 0; i < len; i++)

   printf("%x ", in_str[i]);

  fclose(out);

  printf("\n"); 

 }

 

 return 0;

}

 

使用UltraEdit查看Test、PTest、TTest这三个文件,可以很明显的发现其中的不同。

Test和PTest是二进制文件,TTest就是文本文件。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux