免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7721 | 回复: 51
打印 上一主题 下一主题

求教 c 语言文件读写问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-21 12:37 |只看该作者 |倒序浏览
有个文件中的数据是用逗号分割的(comma-separated values):
Death'dre,Frostpike,2,2,9,10,352
Y'ki,Silversong,1,2,7,43,32768
Ra'las,Exomar,2,3,4,30,6656
分别对应的是 名字, 服务器, 派别, 种族, 阶级, 段数,行业

现在要把这些数据写到另一个确定长度记录的文件中(fixed-length records) 变成:
Death'dre         Frostpike     2 2 9 10  352
Y'ki                   Silversong    1 2 7 43  32768
Ra'las               Exomar        2 3 4 30  6656

格式要求如下:
(名字 size 12 varchar) (服务器 size 30 varchar )
(派别 size 1 Unsigned Int) (种族 size 1 Unsigned Int)  (阶级 size 1 Unsigned Int)
(段数 size 1 Unsigned Int) (行业 size 4 Unsigned Int)

对文件读写刚刚入门,请大家帮忙给点思路, 或者相关的代码

简单的说就是把 A文件 中的内容写到 B文件.
A文件中的记录是用逗号分隔的
B文件中的记录是固定长度的


[ 本帖最后由 daiyihang 于 2007-3-21 20:14 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-03-21 12:38 |只看该作者
求教啊

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2007-03-21 12:41 |只看该作者
搞私服啊?
给你多少钱呢?

论坛徽章:
0
4 [报告]
发表于 2007-03-21 13:08 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2007-03-21 13:13 |只看该作者
原帖由 112233yxl 于 2007-3-21 13:08 发表
挺长时间没写过这么有技术的程序了
我认为大体是这样的:
先fopen(ufile,"r"),然后fgets(buf,fd),
将buf的内容按","分割,
在fputs写入就可以了

不过我认为如果上述过程用shell来实现 ...

如果用 Perl 的话,比 awk 还简单。
print pack( $format, (split /,/)[.....] ) while(<>); 搞定

论坛徽章:
0
6 [报告]
发表于 2007-03-21 13:27 |只看该作者
原帖由 flw 于 2007-3-21 13:13 发表

如果用 Perl 的话,比 awk 还简单。
print pack( $format, (split /,/)[.....] ) while(<>); 搞定

他的空格好像不一样长的

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2007-03-21 13:32 |只看该作者
原帖由 soul_of_moon 于 2007-3-21 13:27 发表

他的空格好像不一样长的

所以才要用 pack 嘛。

论坛徽章:
0
8 [报告]
发表于 2007-03-21 13:38 |只看该作者
原帖由 flw 于 2007-3-21 13:13 发表

如果用 Perl 的话,比 awk 还简单。
print pack( $format, (split /,/)[.....] ) while(<>); 搞定


呵呵
对学C的来说
awk更易懂,且这个实例如果用 Perl 的话,绝对不比 awk 简单。。。。。。。^_^
awk  -F,  '{printf("%12s%30s%1s%1s%1s%1s%4s",$1,$2,$3,$4,$5,$6,$7}'   filename
随手写的,未测试....

如果用C写的话也是简单的一个读写文件的程序
唯一与市面上那些教科书不同的大概就是打开了2个文件吧,汗......................

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2007-03-21 13:50 |只看该作者
原帖由 choki 于 2007-3-21 13:38 发表

且这个实例如果用 Perl 的话,绝对不比 awk 简单。。。。。。。^_^
awk  -F,  '{printf("%12s%30s%1s%1s%1s%1s%4s",$1,$2,$3,$4,$5,$6,$7}'   filename

是吗?
那只能说你对 Perl 不了解。
  1. flw@Sleeper:~$ cat foo
  2. Death'dre,Frostpike,2,2,9,10,352
  3. Y'ki,Silversong,1,2,7,43,32768
  4. Ra'las,Exomar,2,3,4,30,6656
  5. flw@Sleeper:~$ perl -F, -plane '$_=pack( "A13 A31 A2 A2 A2 A3 A5", @F )' foo
  6. Death'dre    Frostpike                      2 2 9 10 352
  7. Y'ki         Silversong                     1 2 7 43 32768
  8. Ra'las       Exomar                         2 3 4 30 6656
  9. flw@Sleeper:~$
复制代码

请比较一下:
  1. awk  -F,  '{printf("%12s%30s%1s%1s%1s%1s%4s",$1,$2,$3,$4,$5,$6,$7}'
  2. perl -F, -plane '$_=pack( "A13 A31 A2 A2 A2 A3 A5", @F )'
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2007-03-21 13:51 |只看该作者
哪个更短?哪个更清晰?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP