| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1637 人关注过本帖
标题:文件读取,最后行重复的解决方案
只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏
 问题点数:0 回复次数:13 
文件读取,最后行重复的解决方案

int main(void)
{
FILE *fp_in;
char *phex=(char *)malloc(sizeof(char)*M);

if((fp_in=fopen("C:\\cms.hex","r"))==NULL)
{
perror("Error Open"); /*系统错误信息*/
}

fseek(fp_in, 0, SEEK_SET);
while(!feof(fp_in)) /*直到文件结束*/
{
fgets(phex,M,fp_in); /* 读取一行字符 */
if(AnalyseHEX(phex))
{
printf("%d\t%s\n",AnalyseHEX(phex),phex);
printf("the error file form !!\n");
free(phex);
fclose(fp_in);
return 0 ;
}
printf("%d\t%s\n",AnalyseHEX(phex),phex);
}

printf("the exact file form !!\n"); /* 正确的intel hex文件 */
fclose(fp_in);
free(phex);
return 0 ;
}
为什么这个程序读取文件显示的时候,最后一行重复呢 ?
麻烦高手帮我看看

搜索更多相关主题的帖子: phex 方案 文件 char 
2007-08-12 17:17
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
程序无法编译通过,因为你没有加#include<stdio.h>

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2007-08-12 17:59
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复:(卧龙孔明)程序无法编译通过,因为你没有加#in...

这个我没有复制完全,真个完整的是:
#include<ctype.h>
#include<stdio.h>
#include<string.h>

#define DataN 16 /* 假定数据区间的最长长度 */
/*定义Intel HEX记录的结构*/
struct {
unsigned char ll ; /*长度 */
unsigned int aaaa ; /*地址 */
unsigned char tt ; /*记录类型,0-数据,1-终止*/
unsigned char dd[DataN]; /* 数据 ??*/
unsigned char cc ; /*校验和*/
} IntelHEX ;

bool AnalyseHEX(char hex[])
{
unsigned char i ;
unsigned char j ;
unsigned char t ;
unsigned char n ;
unsigned char cc ;
unsigned int x ;

if(hex[0]!=':') return 1 ; /*检查冒号*/
t=(toint(hex[1])<<4)+toint(hex[2]); /*检查长度*/
if(t>DataN) return 1 ;
n=2*t+12 ; /* 字符串总的长度,不包括'\0',却为何要 12 呢?? */
if(n!=strlen(hex)) return 1 ;
IntelHEX.ll=t ; /* 有效数字个数 */
cc=t ; /* 对所有值求和以便求补 */

t=(toint(hex[3])<<4)+toint(hex[4]); /*提取地址*/
cc+=t ;
x=(unsigned int)t ;/*提取地址高位*/
x<<=8 ; /* 高位加权 */
t=(toint(hex[5])<<4)+toint(hex[6]);
cc+=t ;
x+=(unsigned int)t ;/*提取地址低位*/
IntelHEX.aaaa=x ; /* 地址 */

t=(toint(hex[7])<<4)+toint(hex[8]); /*提取记录类型*/
if((t==0)||(t==1)) { /* 非扩展地址 */
cc+=t ;
IntelHEX.tt=t ;
}
else {
return 1 ; /* 怎么不允许地址扩展?? */
}
/*提取数据*/
i=9 ; /* 有效数据的开始位置 */
if(t==0) /* 有效数据时: */
{
j=0 ;
n=IntelHEX.ll ;
do {
t=(toint(hex[i++])<<4);
t+=toint(hex[i++]);
cc+=t ;
IntelHEX.dd[j++]=t ;
} while(--n!=0);
}
/*提取校验和*/
t=(toint(hex[i++])<<4); t+=toint(hex[i++]); /* 校验和数值 */
cc+=t ;
IntelHEX.dd[j++]=t ;
/*检查校验*/
if(cc==0) return 0 ;
else return 1 ;
}


#define M (DataN+13) /* 假定Intel HEX 文件中最长行的长度 */

#include<ctype.h>
#include<stdlib.h>


int main(void)
{
FILE *fp_in;
char *phex=(char *)malloc(sizeof(char)*M);

if((fp_in=fopen("C:\\cms.hex","r"))==NULL) /*文件名不区分大小写*/
{
perror("Error Open"); /*系统错误信息*/
}

fseek(fp_in, 0, SEEK_SET);
while(!feof(fp_in)) /*直到文件结束*/
{
fgets(phex,M,fp_in); /* 读取一行字符 */
if(AnalyseHEX(phex))
{ printf("%d\t%s\n",AnalyseHEX(phex),phex);
printf("the error file form !!\n");
free(phex);
fclose(fp_in);
return 0 ;
} printf("%d\t%s\n",AnalyseHEX(phex),phex);
}

printf("the exact file form !!\n"); /* 正确的intel hex文件 */
fclose(fp_in);
free(phex);
return 0 ;
}
本来是希望用来判定intel hex文件的检验码是不是正确的!
附件中文件是一个 intel hex格式的文件 例子

DovZjQAe.rar (1.03 KB) 回复:(卧龙孔明)程序无法编译通过,因为你没有加#in...


[此贴子已经被作者于2007-8-18 9:51:57编辑过]


~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2007-08-12 18:35
gerryken
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-8-14
收藏
得分:0 
It's a bit strange about the function feof() to print the last line twice. I cannot find out the reason by now.
But instead of using feof() to determine the end of a file, you can use while(fgets(phex,M,fp_in)) to bound the read of file. It works fine under my test.

The best thing in life is free.
2007-08-14 18:39
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
while(!feof(fp_in)) /*直到文件结束*/
{
fgets(phex,M,fp_in); /* 读取一行字符 */

改成:

while(fgets(phex,M,fp_in), !feof(fp_in)) /*直到文件结束*/
{

2007-08-14 19:19
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
恩 ,谢谢楼上几位的 热心帮助 , 确实可以了

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2007-08-17 08:54
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复:(雨中飞燕)while(!feof(fp_in)) /*直到...
while(fgets(phex,M,fp_in), !feof(fp_in)) 和 while(fgets(phex,M,fp_in) && !feof(fp_in)) 是等效的吧!
第一次看到这种写法,又长见识了

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2007-08-17 09:05
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
不等效,要看这两个函数的返回值
2007-08-17 09:09
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
while(fgets(phex,M,fp_in), !feof(fp_in))
可以简化为:
while(fgets(phex,M,fp_in))
2007-08-17 09:11
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
这个是因为 fgets(phex,M,fp_in) 和 feof(fp_in) 有关联的原因吗?因为
fgets(phex,M,fp_in)返回NULL 时候,feof(fp_in) 一定是返回 1
所以才有 while(fgets(phex,M,fp_in), !feof(fp_in)) 等效 while(fgets(phex,M,fp_in))

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2007-08-17 09:26
快速回复:文件读取,最后行重复的解决方案
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039199 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved