24小时热门版块排行榜    

查看: 3862  |  回复: 9

meatball1982

铜虫 (小有名气)

[求助] 用C读取xyz文件的坐标信息

有一个由pdb转成的xyz文件。
如图,我想用C将其中的坐标信息提取出来,存在一个新的文件或是数组当中。

7.688102   -2.282595    2.994640
7.303011   -1.469669    3.647740
…………
7.158374    3.922640   -0.572473

只能用C。其实用awk或其它的很容易实现。但这部分最后可能会在一个大的C当中,所以只能用C。

我的思路是每次读入一行,进行判断。但如何判断我还没有想好。因为每行的信息长度不同。

现在有其它的工作,比较着急。非常感谢。

要求,程序要有程序说明和相应的注释。用C读取xyz文件的坐标信息
捕获.GIF
回复此楼

» 本帖附件资源列表

  • 欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
    本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com
  • 附件 1 : diala.xyz
  • 2013-06-26 13:59:40, 1.41 K

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

唉。还是学吧。
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

绿遍山原

铜虫 (小有名气)

【答案】应助回帖


感谢参与,应助指数 +1
jjdg: 金币+1, 感谢参与 2013-06-27 00:33:56
只要坐标就只读每行前四列:
比如
fgetl(line, LINE_MAX, fp);
int n = sscanf(line, "%s %lg %lg %lg", name, &x, &y, &z);
if (n < 4) error("Invalid input"
要夢遊,不要催眠。
2楼2013-06-26 15:17:39
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

meatball1982

铜虫 (小有名气)

引用回帖:
2楼: Originally posted by 绿遍山原 at 2013-06-26 15:17:39
只要坐标就只读每行前四列:
比如
fgetl(line, LINE_MAX, fp);
int n = sscanf(line, "%s %lg %lg %lg", name, &x, &y, &z);
if (n < 4) error("Invalid input"

绿遍山原:
您好。
1.能把整个程序写出来吗?
2.我查了一下,查到的fgetl都是matlab中的函数,这是一个C函数吗?
非常感谢。
唉。还是学吧。
3楼2013-06-26 17:41:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

xiaochong8693

木虫之王 (文坛精英)

祝楼主诸事顺利,万事如意
4楼2013-06-26 18:11:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

绿遍山原

铜虫 (小有名气)

引用回帖:
3楼: Originally posted by meatball1982 at 2013-06-26 17:41:10
绿遍山原:
您好。
1.能把整个程序写出来吗?
2.我查了一下,查到的fgetl都是matlab中的函数,这是一个C函数吗?
非常感谢。...

是c的函数
要夢遊,不要催眠。
5楼2013-06-26 22:30:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

jackie1179

木虫 (正式写手)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...
感谢参与,应助指数 +1
jjdg: 金币+2, 感谢参与 2013-06-27 00:34:06
meatball1982: 金币+50, ★★★很有帮助, 程序完整,有说明。尝试过,好用。 2013-06-27 15:56:29
CODE:
这个或许可以满足你的要求
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

#define BUFSIZE 512

int main(int argc,char *argv[])
{
  FILE *ifp,*ofp;
  char buf[BUFSIZE];
  int number;       // record entry number
  int i;
  double *x,*y,*z;

  if((ifp = fopen("diala.xyz","r+")) == NULL)   // input file handle
  {
    printf("Cannot open this file!\n");
        exit(1);
  }
  if((ofp = fopen(argv[1],"w+")) == NULL)   // output filename obtained from first commandline parameter
  {
    printf("Cannot write to this file!\n");
        exit(1);
  }
  fgets(buf,BUFSIZE,ifp);   // read record entry number
  number = atoi(buf);

  // memory allocation for three arrays
  x = (double *)malloc(sizeof(double) * number);
  y = (double *)malloc(sizeof(double) * number);
  z = (double *)malloc(sizeof(double) * number);


  i = 0;
  while(fgets(buf,BUFSIZE,ifp) != NULL)  // read info line by line
  {
    sscanf(buf,"%*d%*s%lf%lf%lf",&x[i],&y[i],&z[i]);
        fprintf(ofp,"%lf  %lf  %lf\n",x[i],y[i],z[i]);  // write into output file
        i++;
  }

  fclose(ifp);
  fclose(ofp);

  // release memory
  free(x);
  free(y);
  free(z);
  

  return 0;

}

6楼2013-06-26 22:47:21
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

meatball1982

铜虫 (小有名气)

引用回帖:
6楼: Originally posted by jackie1179 at 2013-06-26 22:47:21
这个或许可以满足你的要求
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

#define BUFSIZE 512

int main(int argc,char *argv[])
{
  F ...

稍加修改,正是我想要的。非常感谢!
唉。还是学吧。
7楼2013-06-27 15:55:15
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

迷失的心

铜虫 (初入文坛)

引用回帖:
6楼: Originally posted by jackie1179 at 2013-06-26 22:47:21
这个或许可以满足你的要求
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

#define BUFSIZE 512

int main(int argc,char *argv[])
{
  F ...

想知道buf的大小为什么是512呢?别的数不行吗?
努力才能做到最好
8楼2013-06-30 10:58:20
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

jackie1179

木虫 (正式写手)

引用回帖:
8楼: Originally posted by 迷失的心 at 2013-06-30 10:58:20
想知道buf的大小为什么是512呢?别的数不行吗?...

buf的大小可以是其他数,此值大小不固定,但应尽量设的大一点,否则有可能出错。
9楼2013-07-01 14:45:14
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

迷失的心

铜虫 (初入文坛)

引用回帖:
9楼: Originally posted by jackie1179 at 2013-07-01 14:45:14
buf的大小可以是其他数,此值大小不固定,但应尽量设的大一点,否则有可能出错。...

多谢,只是512这个数太常见了....
努力才能做到最好
10楼2013-07-03 22:36:29
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 meatball1982 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 时间戳变了,能看出什么问题? +16 基诺咪客 2026-08-17 20/1000 2026-08-20 12:44 by 201120518022
[基金申请] 哪位老哥知道今年的国自然具体哪一天放榜? +16 Ldrop2023 2026-08-13 20/1000 2026-08-20 11:07 by xskun
[基金申请] 言之凿凿,8月21号(明天)放榜 +12 医学老男孩 2026-08-20 14/700 2026-08-20 10:53 by ran2233
[基金申请] 只有每年这种时候来逛逛小木虫 +21 yaoyewhu2008 2026-08-20 21/1050 2026-08-20 10:37 by Vivilian
[基金申请] 今天基金会出结果吗?20260819 +14 kkkl_v 2026-08-19 15/750 2026-08-20 08:21 by sunzitan
[基金申请] filecode,4个jtjc了 +11 ziyangfang 2026-08-19 13/650 2026-08-19 21:28 by aasahr
[教师之家] 为什么余额宝的年化利率越来越低?主要原因有哪些? +5 瞬息宇宙 2026-08-15 5/250 2026-08-19 20:23 by super2002521
[基金申请] 今天放榜没戏了吧 +4 yuleib84 2026-08-19 5/250 2026-08-19 19:52 by hhs666
[基金申请] 今天放榜吗? +14 布布和一二 2026-08-19 15/750 2026-08-19 18:07 by gltch
[基金申请] filecode=后面第一个是大写字母 +10 wangze12014 2026-08-14 12/600 2026-08-19 16:56 by 苦难博士
[基金申请] 朋友圈看到的 +6 wangzilk 2026-08-18 8/400 2026-08-19 10:55 by Haru815
[基金申请] 快农历七夕节了,轻松一下,男人悄悄话,女施主请不要进来。 +6 Tide man 2026-08-14 7/350 2026-08-19 09:56 by ZJTJZ
[基金申请] 什么时候开奖? +6 CrisMessi 2026-08-18 6/300 2026-08-19 08:06 by Equinoxhua
[论文投稿] 投稿咨询 +4 wwm09 2026-08-17 6/300 2026-08-18 15:36 by wwm09
[基金申请] 时间戳又变了8-15 +14 archvillain 2026-08-15 26/1300 2026-08-18 13:37 by phantomgost
[基金申请] 今天维护系统维护 祝所有人 高中 +8 gjjjzhong 2026-08-18 9/450 2026-08-18 13:01 by 家与远方
[基金申请] 93BebMhtakh前后11位开头都是大写 +4 且听虎啸 2026-08-17 5/250 2026-08-18 00:49 by 蔡棒棒菂
[基金申请] 今天系统多次维护,明天很可能放榜! +8 zju2000 2026-08-16 9/450 2026-08-17 12:20 by lmz0216
[精细化工] 招聘 金属平磨液,抛光液研发工程师 +3 小天0311 2026-08-14 3/150 2026-08-16 07:31 by H9PLUS
[基金申请] 各位道友,我要去昆明玩几天,回来见。 +7 Tide man 2026-08-14 8/400 2026-08-15 01:11 by arzu_hma
信息提示
请填处理意见