| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 908 人关注过本帖
标题:文件处理老是不对,为什么?
取消只看楼主 加入收藏
winglesswu
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2013-1-28
结帖率:71.88%
收藏
已结贴  问题点数:10 回复次数:6 
文件处理老是不对,为什么?
要求写一个c语言程序,一个公司运营一个路线,每天会产生有两个文件,一个叫locations.txt,
locations.txt.rar (946 Bytes)
,文件里面是站点,站名,价钱,共有200个站点,截取其中一些记录:
      001;Yonge & Front, Toronto;0.00
      010;Yonge & Steeles, Toronto;5.00
      012;Major Mac, Richmond Hill;7.00
      014;Elgin Mills, Richmond Hill;7.50
      017;Stouffville Rd, Richmond Hill;8.00
      020;King Rd, Vaughan;8.50
      023;Bloomington Rd, Aurora;8.50
另一个文件叫tobill.txt,
tobill.txt.rar (762.04 KB)
,里面是每天乘客乘车的刷卡信息,包括:信用卡号码,名字,上车站点,下车站点。下面是一些记录:
      MC1111113454321981:Ron Tarr:073:125
      AX1221123423453452:Cathy Leung:020:010
      VS1234567890654323:John Selmys:001:200
      VS1234567890654324:Geraldine Wynne:200:010
      MC1111113454321985:Rob Tarr:125:073
      AX1221123423453456:Amanda Ng:012:032
要求编一个程序,生成一个名为invoiced.txt的文件,记录乘客的账单,格式为:信用卡信息,名字,上车站名,下车站名,价钱,下面是具体格式:
MC345432198 Jackie Chen Essa Rd, Barrie to Town Hall, North Bay 18.00
信用卡和名字之间有一个空格,名字和上车站名有一个空格,上车站名和下车站名用to相连,站名可能是站名+城市名,如Essa Rd, Barrie表示的站名是Barrie市的Essa Rd,下车站名和价钱有一个空格。
价钱如何计算?比如乘客在第1站上车,在第10站下车,(001;Yonge & Front, Toronto;0.00 010;Yonge & Steeles, Toronto;5.00)价钱为5元(5-0=5),如果从第10站上车,第1站上车,价钱也为5元。
下面是小弟的代码,请大侠看看,为什么运行不了。
#include<stdio.h>
main ()
{
FILE *inbill, * inprice, *charge;
char credit[20], name[20], location[200];
int stop, on, off, passenger=1, x;
double amount, totalamt, price[200];

inbill=fopen("tobill.txt", "r");
inprice=fopen("locations.txt", "r");
charge=fopen("invoiced.txt", "w");

for (x=1; x<201; x++)
   {
   fscanf(inprice, "%d;%[^;];%.2lf\n", &stop, location, &price[x]);
   }
while (EOF != fscanf(inbill, "%[^:]:%[^:]:%d:%d\n", credit, name, &on, &off) )
   {
    amount=price[on]-price[off];
    if (amount<0)
       amount*=-1;
    fprintf(charge, "%s %[A-Z a-z], %d %d %.2lf", credit, name, on, off, amount);//小弟不知道如何输出站名,只好先输出站点了,望赐教
    passenger++;
    totalamt+=amount;
   }
fclose(inbill);
fclose(inprice);
fclose(charge);

printf("Total Number of Passengers %d\n", passenger);
printf("Total Dollars Billed %.2lf\n", totalamt);
printf("Average Fare Billed %.2lf\n", totalamt/passenger);
}


[ 本帖最后由 winglesswu 于 2013-3-29 10:16 编辑 ]
搜索更多相关主题的帖子: c语言程序 
2013-03-29 00:47
winglesswu
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2013-1-28
收藏
得分:0 
以下是引用azzbcc在2013-3-29 07:49:03的发言:

话说你怎么不用结构体?
 
stop 和 lacation 每次读取都被覆盖了、、、

目前只学到怎么读取写文件 什么结构体都没听说过。
2013-03-29 09:24
winglesswu
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2013-1-28
收藏
得分:0 
以下是引用azzbcc在2013-3-29 07:46:22的发言:

先说运行不了的原因,很简单 你的文件名不对,都有两个.txt,比如 tobill.txt.txt
 
改正也简单
inbill=fopen("tobill.txt.txt", "r");
inprice=fopen("locations.txt.txt", "r");
或者删掉一个 .txt
 
另外 你scanf("%.2lf", &price[x]); 读取失败了,把 '.2'去掉就行
 
后面还没看

运行之后的提示是segmentation fault.
2013-03-29 09:25
winglesswu
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2013-1-28
收藏
得分:0 
以下是引用azzbcc在2013-3-29 09:29:26的发言:

我一会有课,中午帮你调吧,建议先看看结构体

谢谢,


[ 本帖最后由 winglesswu 于 2013-3-29 10:02 编辑 ]
2013-03-29 09:41
winglesswu
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2013-1-28
收藏
得分:0 
以下是引用rjsp在2013-3-29 09:48:28的发言:

愣没看懂楼主的描述

格式为:信用卡信息,名字,上车站名,下车站名,价钱,下面是具体格式:
MC345432198 Jackie Chen Essa Rd, Barrie to Town Hall, North Bay 18.00
信用卡和名字之间有一个空格,名字和上车站名有一个空格,上车站名和下车站名用,隔开,站名可能是站名+城市名,如Barrie to Town Hall, North Bay,下车站名和价钱有一个空格。

1,根据你的描述,那格式就不是“信用卡信息,名字,上车站名,下车站名,价钱”,而是“信用卡信息 名字 上车站名, 下车站名,价钱”,信用卡和名字之间有一个空格,名字和上车站名有一个空格,上车站名和下车站名用逗号及空格隔开
2,为什么用空格和逗号隔开?因为信息字符中本身也包含空格和逗号,那拼接起来容易,但以后就无法拆分了。
3,根据你的locations.txt.txt文件,我查了一下,你说的
MC345432198 Jackie Chen Essa Rd, Barrie to Town Hall, North Bay 18.00
应该这么分 MC345432198 Jackie Chen Essa Rd, Barrie to Town Hall, North Bay 18.00
也就是说你前面又说错了,根本不是“上车站名和下车站名用,隔开”,而是“上车站名和下车站名用 空格to空格 隔开”
4,“站名可能是站名+城市名,如Barrie to Town Hall, North Bay”--- 这就更看不懂了,“Barrie”明明是上站名称的后半部分
5,价格也不对
170;Essa Rd, Barrie;30.00
190;Town Hall, North Bay;50.00
那么价格应该是20.00,不是18.00

这些信息是学校网站上下载的,价钱对不对无所谓,只要能够生成invoice文件就行,版主分析的location格式得对,谢谢。比如Essa Rd, Barrie to Town Hall, North Bay这个上下车站名,上车地点是Barrie市的Essa Rd,下车地点是North Bay市的Town Hall,中间用to隔开。再次谢谢版主的提醒。
2013-03-29 10:12
winglesswu
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2013-1-28
收藏
得分:0 
以下是引用azzbcc在2013-3-29 15:06:29的发言:

你的,那个站点记录不是连续的,不能那样直接录入数组的,回导致 后面的amount值出错
 
totalamt未初始化
 
printf函数里面 用这个 %[] ?

我数了一下,里面有30个站,因此我把scanf inprice文件的代码改成:
for (x=1; x<31; x++)
   {
   fscanf(inprice, "%d;%[^;];%lf\n", &stop, location, &price[x]);
   }
还是不能运行。到底是哪里出错呢?
2013-03-29 22:56
winglesswu
Rank: 1
等 级:新手上路
帖 子:92
专家分:0
注 册:2013-1-28
收藏
得分:0 
以下是引用azzbcc在2013-3-29 15:06:29的发言:

你的,那个站点记录不是连续的,不能那样直接录入数组的,回导致 后面的amount值出错
 
totalamt未初始化
 
printf函数里面 用这个 %[] ?

程序要求里说明:You can assume that there will be at most 200 stops. You can also assume that the stop numbers are always in order from smallest to biggest but that some stop numbers may not be currently used and thus do not exist in the file.
编程者可假设有200个站点,站点是按照从小到大排列,有些站点目前未使用,因此不在locations.txt中。
2013-03-29 23:03
快速回复:文件处理老是不对,为什么?
数据加载中...
 
   



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

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