C语言 读取特定格式文件

271865000111A6445001010B133300100000C22370000000D32390010110......fscanf(fp,"%d",&n);... 27
186 50 0 0 111
A 64 45 0 0 1010
B 13 33 0 0 100000
C 22 37 0 0 00000
D 32 39 0 0 10110
......

fscanf(fp,"%d", &n);
fscanf(fp, "%c %d %d %d %d %d %s",&(HT[i].elem), &(HT[i].weight), &(HT[i].parent), &(HT[i].lchild), &(HT[i].rchild), str);

HT[i].elem读入的是换行符 10

fscanf(fp,"%d\n", &n);
HT[i].elem读入的是第一组数字的首位1

没有空格字符则没问题
如何读入空格?
int Encoding(HuffmanTree &HT, HuffmanCode &HC, unsigned int &n) {
FILE *fp;
char str[30] = {0};
if((fp = fopen("hfmTree.txt","r")) == NULL)
return 0;
else {
fscanf(fp,"%d\n", &n);
m = 2 * n - 1;
i = 1;
j = 0;
HT = (HuffmanTree)malloc((m + 1) * sizeof(HTNode));
HC = (HuffmanCode)malloc((m + 1) * sizeof(CodeList));
while(!feof(fp)) {
fscanf(fp, "%d %d %d %d %d %d %s",&(HT[i].elem), &(HT[i].weight), &(HT[i].parent), &(HT[i].lchild), &(HT[i].rchild), str);

文件中的部分数据
27
32 186 50 0 0 111
......

str接收到的字符为'o',不是'111'
展开
 我来答
Richardby
2011-05-21 · TA获得超过237个赞
知道答主
回答量:104
采纳率:0%
帮助的人:105万
展开全部
27
1 86 50 0 0 111
A 64 45 0 0 1010
B 13 33 0 0 100000
C 22 37 0 0 00000
D 32 39 0 0 10110
......
换行符其实没有必要储存,如果起始行有空格也没有问题,可以在函数中这么改:

fscanf(fp,"%d\n", &n);
fscanf(fp, "%c %d %d %d %d %d %s\n",&(HT[i].elem), &(HT[i].weight), &(HT[i].parent), &(HT[i].lchild), &(HT[i].rchild), str);

则HT[i].elem读入的是序号,如给出的A、B、C、D
fscanf(fp,"%d\n", &n);
HT[i].elem读入的是第一组数字的首位1
更多追问追答
追问
其实编的是赫夫曼树,如果出现了1的编码就会出错了,所以我最后使用的是输出asc码的int值

但是%s str 收录到的数据是'o',就是asc的111对应的小写字母'o',而不是字符串'111',这个如何解决
追答
最后一列数据是几位数的?’
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
L_o_o_n_i_e
2011-05-22 · TA获得超过4.2万个赞
知道大有可为答主
回答量:8507
采纳率:38%
帮助的人:5094万
展开全部
简述读的策略:
char c1[5],c6[12];
int c2,c3,c4,c5;
第一行 fscanf(fp,"%d", &n);
第二行 fscanf(fp,"%d %d %d %d %s", &c2,&c3,&c4,&c5,c6);
第三行起,如果不要第一列字符,可以跳过:
fscanf(fp,"%*s %d %d %d %d %s", &c2,&c3,&c4,&c5,c6);
如果要第一列字符:
fscanf(fp,"%s %d %d %d %d %d %s", c1,&c2,&c3,&c4,&c5,c6);
c6 用字符串才能保存 "0000000000", 否则存 0, 不是你所要。
==========
具体读,若要同时保留数据,则,c1,c6 应当是2维数组
feof 的判断应在读语句以后立即判断,以免最后一行出错(常有人重复输出最后一行)。
==
char 型 是 1 字节 整型。'o' 就是整型值,字符常量,"o"是字符串。
有格式输出,%d %x %o 输出 ASCII 值, 10,16,8 进制。 %c 字符。%s 字符串形式。
更多追问追答
追问
忘了说,代码str定义是char str[30]

“具体读,若要同时保留数据,则,c1,c6 应当是2维数组”
对c6使用二维数组表示不解

使用("%s", str)接收111,str = 'o',而不是str = '111',是因为使用了一维数组的原因?
追答
读K行字符串, 并保留,要开数组 char c6[K][30];
("%s", str)接收111, 则是 "111\0"
("%s", str) 接收'o' 则是"'o'\0"
"%d",&str[i]) 接收'o' 则是 整数 'o'
----------
你用:
fscanf(fp,"%d", &n);
fscanf(fp, "%c 读入的内容会搞混,多一个空白少一个空白读入结果就会乱。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式