首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

散分 ,顺便请问有关问题

2012-02-11 
散分 ,顺便请教问题文本文件内容如下:0x00,0x00,0x02,0x30,0x00,0x00,0x00,0x00,0x25,0x01,0x01,0x10,0x01

散分 ,顺便请教问题
文本文件内容如下:
0x00,   0x00,   0x02,   0x30,   0x00,   0x00,   0x00,   0x00,   0x25,   0x01,   0x01,   0x10,   0x01,   0x02,   0x00,   0x00,
0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0xb5,   0xd8,   0xcf,   0xc2,   0xa3,   0xb1,   0xb3,
0xac,   0xca,   0xd0,   0xa1,   0xa1,   0xa1,   0xa1,   0xa1,   0xa1,   0xa1,   0xa1,   0xa1,   0xa1,   0xca,   0x25,   0x01
比如说我现在想从这个文本文件的0x25开始读取,然后把读取出来的数据在屏幕上打印出来   ,请问这个读取数据的过程是怎样做的   ?具体是   如何实现的?谢谢,请高手帮帮我


[解决办法]
从文件的头指针开始一个一个读下去,
当然,在这个过程中要保留四个字符
比如生成一个四个空间的字符数组
每读取下一个,那么就把
2-〉1,3-〉2,4-〉3移动一个位置,然后把新读取近来的字符
添加到末尾 4 这个位置,判断它是不是 0X25
然后

[解决办法]
先接分,再看题目
[解决办法]
同意楼上
[解决办法]
/*-----------------------------

http://community.csdn.net/Expert/TopicView3.asp?id=5746261

*---------------------------*/

#include <stdlib.h>
#include <stdio.h>

#define WORD_MAXLEN 8
char buf[WORD_MAXLEN];
int idx;
/**
@ret
0 - ok
-1 -error
**/
int read(FILE *fp)
{
int c;
while(1)
{
c = getc(fp);
switch(c)
{
case ', ':
buf[idx] = '\0 ';
idx=0;
return 0;;
case '\n ':
break;
case EOF:
return -1;

default:
buf[idx++] = c;
}
}
}

/* just for demostration , no error handler */
int main(int argc, char**argv)
{
FILE *in = stdin;
int data;
int started = 0;

if(argc> 1)
{
in = fopen(argv[1], "r ");
if (!in)
exit(1);
}



while (read(in) != -1)
{

/* str form */
printf ( "\nstr: %4s ", buf);

/* int form */
sscanf (buf, "%x ", &data);
if (data == 0x25)
started = 1;

if (started)
printf ( ", int: %x ", data);
}

if (argc> 1)
fclose (in);
}

-------------------- output -------------------
tr: 0x00
str: 0x00
str: 0x02
str: 0x30
str: 0x00
str: 0x00
str: 0x00
str: 0x00
str: 0x25, int: 25
str: 0x01, int: 1
str: 0x01, int: 1
str: 0x10, int: 10
str: 0x01, int: 1
str: 0x02, int: 2
str: 0x00, int: 0
str: 0x00, int: 0
str: 0x00, int: 0
str: 0x00, int: 0
str: 0x00, int: 0
str: 0x00, int: 0
str: 0x00, int: 0
str: 0x00, int: 0
str: 0x00, int: 0
str: 0x00, int: 0
str: 0x00, int: 0
str: 0xb5, int: b5
str: 0xd8, int: d8
str: 0xcf, int: cf
str: 0xc2, int: c2
str: 0xa3, int: a3
str: 0xb1, int: b1
str: 0xb3, int: b3
str: 0xac, int: ac
str: 0xca, int: ca
str: 0xd0, int: d0
str: 0xa1, int: a1
str: 0xa1, int: a1
str: 0xa1, int: a1
str: 0xa1, int: a1
str: 0xa1, int: a1
str: 0xa1, int: a1


str: 0xa1, int: a1
str: 0xa1, int: a1
str: 0xa1, int: a1
str: 0xa1, int: a1
str: 0xca, int: ca
str: 0x25, int: 25
[解决办法]
就是一个一个字符的读取了,当成ASCII码来读就可以了
[解决办法]
up...
jf
[解决办法]
read from the beginning one by one
[解决办法]
C++中好像有专门的函数可以调用。
[解决办法]
jf
[解决办法]
看来搂住有必要弄清楚一下FILE和流的关系!

c语言中使用流来作为程序与实际外部设备桥梁:所有对外部设备的输入输出操作都必须通过流进行,而每个流则与一个文件或是一外部输入输出设备相关联,因此在做输入输出操作前必须先将一个流与相应的文件或设备相关联,在stdio.h中说明了一个指向预定义结构类型FILE的指针,即指向相应流的指针(具体定义详情在stdio.h中查看)。
在FILE结构中有一个成员叫做文件位置指示符,它指向说要读写的下一个字符(字节)。当对流(文件)操作时,该指示符将被调整到指向下一个字符(字节)。文件位置指示符不能被直接使用,但可以通过fseek,fsetpos,fgetpos,ftell和rewind这几个库函数操作,从而达到操作的目的。
流可以分成正文流和二进制流。
正文流是字符序列,由一系列正文行组成,不论流(文件)实际上如何存储,只要把它们以正文方式读入内存,运行时函数会自动地在所读入每一行正文的末尾插入一个换行符(如果原来没有)。这样对于正文行就有了统一的方式,对于正文流中的字符与实际存储在外部设备上的字符不必一一对应,而只要求所读出的字符与此前写进去的相同就行,在正文流中指可以输入输出可打印的字符、制表符和换行符,在stdio.h中定义了三个标准的正文流(指针)即:stderr、stdin和stdout,每个就指针分别指向不同的外部设备,当然,在很多环境中都可以将它们重新定位。
二进制流不像正文文件那样分成若干行,在二进制流中可以处理包括各种控制符在内的所有字符,通过二进制就处理的字符必须与存储在相应外部设备上的字符一一对应。二进制流主要用来处理费正文数据。
[解决办法]
学习....
[解决办法]
楼主的意思应该不是处理二进制文件吧
用文件处理库函数一个一个字符的读吧
或者四个四个的读
然后比较……
我只能想出这种法子

先MARK, 再学习~
[解决办法]
引:
恩, 两个0x25之间的数据是一个包 ,得先取出来,然后发出去

===
是要一个一个读,,比较的. 楼主的想法是对的.
因为不读就不知道,这个数是不是0x25.
其他方法应该都是基于这个的.

那么还有另外一个, 是性能的问题, fgetc,fread这些函数底层是有cache的,
如果性能很不好, 可以试着用 setvbuf 打开,扩大 C 库内置的IO读取缓存.

[解决办法]
接分,学习
[解决办法]
学习下~~~~~~~~
顺便接分
[解决办法]
//感觉直接读int就可以了。。。

#include <stdio.h>

int main(void)
{
FILE *fp;
char ch;
int tmp = 0;

fp = fopen( "a.txt ", "r ");
/* if (fp == NULL) return 1;*/
if ((ch = fgetc(fp)) != EOF)
{
ungetc(ch, fp);
fscanf(fp, "%x ", &tmp);
while ((ch = fgetc(fp)) != EOF && tmp != 0x25)
{
fscanf(fp, "%x ", &tmp);
}
printf( "0x%.2x\n ", tmp);
while ((ch = fgetc(fp)) != EOF)
{
fscanf(fp, "%x ", &tmp);
printf( "0x%.2x\n ", tmp);
}
}

fclose(fp);

return 0;
}

热点排行