| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 893 人关注过本帖
标题:关于 fseek 函数的问题
只看楼主 加入收藏
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
结帖率:91.67%
收藏
已结贴  问题点数:20 回复次数:18 
关于 fseek 函数的问题
我有一个文件,前N行是一部分(每行3个数),后N行是一部分(每行3个数),现在分别要用前N行的和后N行的分别每行对应匹配,用着六个数计算,然后输入到另一个文件,我的程序中,在读入后N行时有错误,我估计是fseek的问题,求大神指导
例如:
已知文件:
12.7 45.98 23.6
12.5 45.88 22.0
(为了简便,将问题简化成前一行和后一行)
我的代码:
if((fp1=fopen("1.txt","r"))==NULL)
    {printf("open error\n");
    system("pause");
    exit(0);
     }
   
    if((fp2=fopen("1.txt","r"))==NULL)
   {printf("open error\n");
   system("pause");
   exit(0);
     }
     fseek(fp2,(sizeof(double)*(N)*3L+1L*(N)*sizeof('\n')+2L*(N)*sizeof(' ')),0);  
     for(i=0;i<N;i++){
       fscanf(fp1,"%lf %lf %lf",&x1,&y1,&z1);
    //   printf("%lf,%lf,%lf\n",x1,y1,z1);  (这里是调试时自己加的)
       fscanf(fp2,"%lf %lf %lf",&x2,&y2,&z2);
    //   printf("%lf,%lf,%lf\n",x2,y2,z2);  (这里是调试时自己加的)
       a[i]=yunsuan(x1,x2,y1,y2,z1,z2);
       }
       fclose(fp2);
       fclose(fp1);
    if((fp3=fopen("2.txt","w"))==NULL)  //将最后的结果放在2.txt文件中
    {printf("open error\n");
    system("pause");
    exit(0);
     }
     for(i=0;i<N;i++)
     {
     fprintf(fp3,"%lf",a[i]);
     fputs("\n",fp3);
     }
     fclose(fp3);
搜索更多相关主题的帖子: system 
2014-10-18 16:04
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
收藏
得分:0 
木有人吗?自顶一个
2014-10-18 22:16
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
不用仔细看和调试,使用fseek()进行绝对定位错的几率是九成以上。

授人以渔,不授人以鱼。
2014-10-18 22:18
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
收藏
得分:0 
回复 3 楼 TonyDeng
。。。版主不要吐槽我啦,快快说说该怎么改呢???
2014-10-18 22:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你用定位想干什么?读写文件,尽量只走一趟,不要来回跑,一行一行读进来,在内存中处理,不要把文件当内存用,不一样的。fseek()通常只有三种用法,到文件的头和尾、以及当前位置,其余有偏移量的,都不保证位置与期望的相符。

外设中的数据处理,其实与机器有关,同样存在类似对齐那样的东西,在内存中是这么大,但写到外设中未必是同样大,这是文件管理系统负责的,操作系统与语言经过多重翻译转换,都不保证原样传递,所以尽量不要用绝对定位。

其实不要老抱着低级底层思维去编程,这是我多次说过和张贴过各种资料(比如《C++编程规范》)的观点:“不要给数据照X光”。学C、汇编的人最喜欢在这方面入魔。

授人以渔,不授人以鱼。
2014-10-18 22:36
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
收藏
得分:0 
回复 5 楼 TonyDeng
哎,看来又是这里的问题,目测前方还有好长的路要走。。。
不说了,
这就去改代码
2014-10-18 22:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
不信邪的结果,多碰点钉子才会明白的,是好事,否则以为一帆风顺,最终害了你。

授人以渔,不授人以鱼。
2014-10-18 22:47
soulmate1023
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:6
帖 子:256
专家分:831
注 册:2014-9-23
收藏
得分:0 
回复 7 楼 TonyDeng
对啦,那楼主,在这个题中是由58组数据,还不是很多,那要是数据多了,也要一一读入内存,如要要用数组,岂不是要开一个很大的数组,如果用链表,那每个结点结构里也会有int 型的值,虽说这避免了一个连续的内存块,但会不会也挺费空间的??
2014-10-18 22:55
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
数据量大,当然在堆中申请空间。至于用不用链表,看你自己处理链表的手段够不够了。C的内存管理,向来是老大难。所谓多写代码,就是让你碰到这类问题,知道到底怎么回事,才知道人家各种解决方案针对什么问题。

我之前就提示过你,用C++标准库的vector是最佳方案,若你固守C,就只能用链表,必须面对历史老大难问题。

授人以渔,不授人以鱼。
2014-10-18 23:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
使用外部文件,设计文件结构的时候,就应该考虑怎么读怎么写,两方面是要结合的,不然随意写出去,给读制造麻烦,或反过来,都不好。比如你这个文件,既然把两部分不同的数据放在同一个文件中,那么就应该在两部分之间有一个分隔标志,给读程序识别以方便,不用把文件指针来回移动的。

绝大多数时候,在设计上解决问题,比靠技术容易、有效得多。


[ 本帖最后由 TonyDeng 于 2014-10-18 23:21 编辑 ]

授人以渔,不授人以鱼。
2014-10-18 23:10
快速回复:关于 fseek 函数的问题
数据加载中...
 
   



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

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