| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2430 人关注过本帖, 1 人收藏
标题:fscanf 文件读取 信息到结构体发生错位
只看楼主 加入收藏
黄昏黄昏
Rank: 2
等 级:论坛游民
帖 子:49
专家分:41
注 册:2013-1-10
结帖率:50%
收藏(1)
已结贴  问题点数:20 回复次数:6 
fscanf 文件读取 信息到结构体发生错位
程序代码:
#pragma warning(disable:4996)
#define _CRT_CPP_OVERLOADS_STANDARD_NAMES 1

#include "stdio.h"

struct test
{
    int i;
    char s[81];
} test[10];
int main()
{
    FILE *fp = fopen("1.txt", "r");
    int t = 0;
    while (!feof(fp))
    {
        fscanf(fp, "%d%s\n", &t, test[t].s);
        test[t].i = t;
    }
    t = 0;
    while (t < 5)
    {
        printf("%d %s \n", test[t].i, test[t].s);
        ++t;
    }
    return 0;
}


文件1.txt 内容是
2  aa
3  bb
4  cc


输出结果是:
0 aa
0
2 bb
3 cc
4

我的目的是,将读取到的每行数据读入到   以每行数据第一部分的数  为下标的数组元素里,并将该下标的值赋给该结构体元素的成员i。
但是每次都发生读取错位,具体是aa所对应元素与循环外的t的初始值相对应,但i的值却始终为0, bb对应文件上一行的2,  cc对应上一行的3  ,4则对应<NULL>。。。 说不清楚
代码很短,但实在找不出原因,另外,如果将%d%s 分别用两个fscanf()读取就正常了,为什么放在一起会出现这样的原因???跪求解答啊!!!

[ 本帖最后由 黄昏黄昏 于 2013-7-8 20:53 编辑 ]
搜索更多相关主题的帖子: 信息 结构体 warning 
2013-07-08 20:51
雪狼MJ
Rank: 8Rank: 8
来 自:甘肃
等 级:蝙蝠侠
威 望:4
帖 子:267
专家分:853
注 册:2012-5-27
收藏
得分:20 
额,我是冲头像来的,哈哈~

第一,没有文件是否打开的判断

第二,fscanf是格式化读取,文件中是什么样子的,读取的格式就是怎么样的。

第三,那个t的变化应该是t=test[t].i,但是这样会造成test数组第二个的缺失,建议还是用t++更好。

第四,没有文件关闭的函数,应该在末尾关闭文件流:fclose(fp);

但愿你不是头像党~我已经遇到过一个了。。。。

Edsger Dijkstra:算法+数据结构=程序
2013-07-08 21:36
黄昏黄昏
Rank: 2
等 级:论坛游民
帖 子:49
专家分:41
注 册:2013-1-10
收藏
得分:0 
以下是引用雪狼MJ在2013-7-8 21:36:54的发言:

额,我是冲头像来的,哈哈~

第一,没有文件是否打开的判断

第二,fscanf是格式化读取,文件中是什么样子的,读取的格式就是怎么样的。

第三,那个t的变化应该是t=test[t].i,但是这样会造成test数组第二个的缺失,建议还是用t++更好。

第四,没有文件关闭的函数,应该在末尾关闭文件流:fclose(fp);

但愿你不是头像党~我已经遇到过一个了。。。。


第一点不重要,我只是想知道这个错位的问题,写下测试的,文件是存在的并且内容已经给出;读取的格式就是文本内容的格式;我不是要依次存储,而是随机,比如文件内容第一行的数是10,则将该行相应存到test[10],第二行是20,则存到test[20],另外test数组是全局变量,没有赋值的话是默认数据块全置零的,所以没有未初始化变量的问题;第四个。。也无所谓啦,反正我只是拿来测试一下而已,不是要做真正的题目,不过以后我会注意的,尽量按照规范来写。。。但是这些都和我要问的问题无关啊!!

另外,我是纯爷们,缺爱的骚年我可以给你最温暖的肩膀,千万不要客气

得不到的永远在骚动,被偏爱都有恃无恐
2013-07-08 21:45
雪狼MJ
Rank: 8Rank: 8
来 自:甘肃
等 级:蝙蝠侠
威 望:4
帖 子:267
专家分:853
注 册:2012-5-27
收藏
得分:0 

我说的是你的头像,你激动啥!!

呵呵,你这个要求挺怪异的。

那就这样改:

程序代码:
#include <stdio.h>
#include <stdlib.h>
struct Test
{
     int i;
     char s[81];
}test[10];

int main()

 {
     FILE *fp = fopen("1.txt", "r");
     if(fp==NULL)
     {
         printf("can't open!\n");
        exit(0);
     }
     int t = 0;
     while (!feof(fp))
     {
         fscanf(fp, "%d", &test[t].i);
         t=test[t].i;
       
         fscanf(fp, " %s\n", test[t].s);
     }
     t = 0;
     while (t < 5)
     {
         printf("%d %s \n", test[t].i, test[t].s);
         ++t;
     }
   
     fclose(fp);
     return 0;

 }

实例输出:
2
0
3 aa
4 bb
0 dd
请按任意键继续. . .

从0开始,aa的位置是2,bb的位置是3,dd的位置是4,那你这样的话,读出的序号用处就是字符串的位置,所以后面显示的话就没什么用了。



Edsger Dijkstra:算法+数据结构=程序
2013-07-08 21:59
黄昏黄昏
Rank: 2
等 级:论坛游民
帖 子:49
专家分:41
注 册:2013-1-10
收藏
得分:0 
以下是引用雪狼MJ在2013-7-8 21:59:31的发言:


我说的是你的头像,你激动啥!!

呵呵,你这个要求挺怪异的。

那就这样改:


#include <stdio.h>
#include <stdlib.h>
struct Test
{
     int i;
     char s[81];
}test[10];

int main()
 {
     FILE *fp = fopen("1.txt", "r");
     if(fp==NULL)
     {
         printf("can't open!\n");
        exit(0);
     }
     int t = 0;
     while (!feof(fp))
     {
         fscanf(fp, "%d", &test[t].i);
         t=test[t].i;
      
         fscanf(fp, " %s\n", test[t].s);
     }
     t = 0;
     while (t < 5)
     {
         printf("%d %s \n", test[t].i, test[t].s);
         ++t;
     }
   
     fclose(fp);
     return 0;
 }
实例输出:
2
0
3 aa
4 bb
0 dd
请按任意键继续. . .

从0开始,aa的位置是2,bb的位置是3,dd的位置是4,那你这样的话,读出的序号用处就是字符串的位置,所以后面显示的话就没什么用了。


艾玛,这不就是我说的分开读取嘛,这个我知道行,但是连在一块儿读取怎么就不行了呢?

得不到的永远在骚动,被偏爱都有恃无恐
2013-07-08 22:08
雪狼MJ
Rank: 8Rank: 8
来 自:甘肃
等 级:蝙蝠侠
威 望:4
帖 子:267
专家分:853
注 册:2012-5-27
收藏
得分:0 

你咋这么蛋疼呢!

我猜你的想法是不是要这样:fscanf(fp, "%d %s\n", &test[t].i, test[test[t].i].s);?

这样是不行的,fscanf是个函数,括号里的都是形参,他们都是传递进去使用的,你总不可以让第一个函数传递进去,然后去让改变的第一个参数去改变第二个函数再传进去吧?

逻辑不通。

函数的形参是在计算好后传进函数中使用的,我说的够清楚吗?

Edsger Dijkstra:算法+数据结构=程序
2013-07-08 22:24
黄昏黄昏
Rank: 2
等 级:论坛游民
帖 子:49
专家分:41
注 册:2013-1-10
收藏
得分:0 
以下是引用雪狼MJ在2013-7-8 22:24:49的发言:


你咋这么蛋疼呢!

我猜你的想法是不是要这样:fscanf(fp, "%d %s\n", &test[t].i, test[test[t].i].s);?

这样是不行的,fscanf是个函数,括号里的都是形参,他们都是传递进去使用的,你总不可以让第一个函数传递进去,然后去让改变的第一个参数去改变第二个函数再传进去吧?

逻辑不通。

函数的形参是在计算好后传进函数中使用的,我说的够清楚吗?


嗯够了,这样我就明白了

得不到的永远在骚动,被偏爱都有恃无恐
2013-07-08 22:49
快速回复:fscanf 文件读取 信息到结构体发生错位
数据加载中...
 
   



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

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