24小时热门版块排行榜    

查看: 1224  |  回复: 5

nenyan

铜虫 (初入文坛)


[交流] 【求助】菜鸟求助c语言读文件小问题

2 UGC12889 0.00047 47.27450 3.1 13.31 1.546 0.498 1.314 ~ 0.85 0.100 ~ -21.05 72.458 10.869 0.61 0.61  
4 PGC000004 0.00096 23.08764 5.0 15.39 0.851 0.078 0.186 ~ 0.219 0.015 ~ -18.68 63.264 13.918 0.39 0.40  
6 PGC000006 0.00058 15.88165 -1.0 15.23 0.457 0.169 0.324 ~ 0.708 0.082 ~ -19.46 84.181 18.520 0.34 0.35  
7 PGC000007 0.00122 -0.08326 -3.2 15.54 0.575 0.093 0.467 ~ 0.813 0.056 ~ -19.46 97.347 21.416 0.33 0.34  
10 PGC000010 0.00217 -0.04057 -3.2 15.56 0.562 0.078 0.446 ~ 0.794 0.037 ~ -19.46 98.250 21.615 0.29 0.31  
12 PGC000012 0.00240 -6.37390 1.1 14.05 1.045 0.336 0.199 ~ 0.19 0.022 ~ -20.79 92.153 13.823 0.36 0.37  

txt文件,格式如上,空格是分隔符。读出期中六列分辨存为数组。
我写的程序如下:
提示 memory error22 (就是扩展的时候出错了。)。请好心人帮帮忙。


#include
#include
#include
#define BUF 1024
#define pi 3.14159

/* The function reads stings from a txt file. Here, we read GWGCCatalog.txt.(see main function) */

int
readevent( FILE *pFile, int **pgc, char **name, double **rag, double **decg, double **absmag, double **dist)
{
void *pgc1, *name1, *rag1, *decg1, *absmag1, *dist1;
char *temp, *temp1; /* these two variables can be overwritten. */   
int i=0, n=1024; /* n is the buffer. */

if ( !(*pgc=(int *)malloc(n*sizeof(int)))||
  !(*name=(char *)malloc(n*100))||
  !(*rag=(double *)malloc(n*sizeof(double)))||
  !(*decg=(double *)malloc(n*sizeof(double)))||
  !(*absmag=(double *)malloc(n*sizeof(double)))||
  !(*dist=(double *)malloc(n*sizeof(double)))||
  !(temp=(char *)malloc(n*100)) ) /* assume the longth of all strings less than 300 */
printf("memory error11\n";

while (!feof(pFile))
{ fscanf(pFile, "%d %s %e %e %s %s %s %s %s %s %s %s %s %e %e %s %s %s", *pgc+i, *name+i*100, *rag+i, *decg+i, temp, temp, temp, temp, temp, temp, temp, temp, temp, *absmag+i, *dist+i, temp, temp, temp);
i++;
if (i==(n-1)) /*the number of lines is going to be longer than buffer. */
{
  if(!(pgc1=realloc(*pgc, 2*n*sizeof(int)))||
  !(name1=realloc(*name, 2*n*100))||
  !(rag1=realloc(*rag, 2*n*sizeof(double)))||
  !(decg1=realloc(*decg, 2*n*sizeof(double)))||
  !(absmag1=realloc(*absmag, 2*n*sizeof(double)))||
  !(dist1=realloc(*dist, 2*n*sizeof(double)))||
  !(temp1=realloc(temp, 2*n*100))) {
  printf("memory error22\n"; }
*pgc=pgc1;
*name=name1;
*rag=rag1;
*decg=decg1;
*absmag=absmag1;
*dist=dist1;
temp=temp1;
n*=2; } /*double the buffer*/
}   
free(temp);
return i; /* Returning i tell us the accurate number.*/
}


int
main()
{
int i, n; /* n is the number of lines in GWGCCatalog.txt. n1 is that in skymap.txt */
int *pgc;
char *name=NULL;
double *rag, *decg, *absmag, *dist;
FILE *pFile, *out;



if ( !( pFile=fopen("GWGCCatalog.txt", "r")) {
printf ("cannot open the GWGCCatalog.txt file\n";
return 1;}

if ( !( out=fopen("goutput.txt", "w")) {
printf ("cannot open the goutput.txt file\n";
return 1;}

n=readevent(pFile, &pgc, &name, &rag, &decg, &absmag, &dist);

for (i=0; i fprintf(out, "%d, %s, %e, %e, %e, %e \n", pgc, name+i*100, rag, decg, absmag, dist);


free(pgc);
free(name);
free(rag);
free(decg);
free(absmag);
free(dist);

fclose(pFile);
fclose(out);
}
回复此楼

» 猜你喜欢

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

» 抢金币啦!回帖就可以得到:

查看全部散金贴

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
★ ★ ★ ★ ★
余泽成(金币+5): 谢谢参与应助! 2011-02-27 15:05:48
(1)建议您认真看看scanf函数的读取格式(%后面那几个字母)的含义。
如%*s,%*d等。应该很简洁,您写得太......繁琐了
(2)指针的分配、释放,应该在同一个函数里。
(3)永远不要假设要读取的文件满足您想象的格式
(4)feof()不能这么用。您能找到的所有feof例子(包括教科书、教程),几乎都是错误的。
2楼2011-02-24 11:47:13
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

bitgreen

金虫 (小有名气)


★ ★
余泽成(金币+2): 谢谢参与应助! 2011-02-27 15:05:56
如果纯粹数据处理,我通常选择shell和mathematica合用,高效省事
3楼2011-02-24 12:09:25
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

nenyan

铜虫 (初入文坛)


引用回帖:
Originally posted by yalefield at 2011-02-24 11:47:13:
(1)建议您认真看看scanf函数的读取格式(%后面那几个字母)的含义。
如%*s,%*d等。应该很简洁,您写得太......繁琐了
(2)指针的分配、释放,应该在同一个函数里。
(3)永远不要假设要读取的文件满足您想 ...

是%*s吗,哪里可以查到呢。给一个建议吧。

指针在子函数中就释放吗?后面主函数中直接当成数组用就可以了吗?

文件是被我处理成那个格式的。。。
4楼2011-02-24 14:27:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

nenyan

铜虫 (初入文坛)


引用回帖:
Originally posted by bitgreen at 2011-02-24 12:09:25:
如果纯粹数据处理,我通常选择shell和mathematica合用,高效省事

呃,mathematica似乎读入数据也很麻烦。
5楼2011-02-24 14:28:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

bitgreen

金虫 (小有名气)


★ ★ ★ ★ ★
余泽成(金币+5): 谢谢参与应助! 2011-02-27 15:06:14
nenyan(金币+5): 不错不错 2011-02-28 07:35:09
引用回帖:
Originally posted by nenyan at 2011-02-24 14:28:31:
呃,mathematica似乎读入数据也很麻烦。

呵呵,不麻烦。比如你上面的数据可以用bash shell 很容易写成mathematica的输入形式
{
{1,2,3,4,5,6,7,……},
{1,2,3,4,5,6,7,……},
.
.
.
.
{1,2,3,4,5,6,7,……},
{1,2,3,4,5,6,7,……}
}
然后用mathematica的Get来读入,mathematica有一大堆功能强大的函数来处理数据,非常高效,呵呵。
比如你的数据文件名为urfile
1)##以下命令行让数据以逗号为间隔,存成urfile_for_Ma
cat urfile |awk '{$1=$1;print}'|sed 's/ /,/g' >urfile_for_Ma

2)##以下命令给数据行添加{}
sed -i 's/^/{/'  urfile_for_Ma  #给所有数据行首添加{
sed -i 's/$/},/'  urfile_for_Ma  #数据行末尾添加},
sed -i '1s/^/{/' urfile_for_Ma  #第一行首再加个{
sed -i '$s/,$/}/' urfile_for_Ma  #最后一行行尾的“,”换成“}”


搞定。可以用mathematica来处理了。

p.s.:
当然可以把这些命令放一个脚本文件里比如叫form_change,执行一下就ok了.
你还可以在脚本里定义变量
urfile=$1
然后再调用$urfile这个变量,这样你就可以用form_change urfile来执行,不用每次处理不同的文件都要改脚本文件里的文件名,省事很多

[ Last edited by bitgreen on 2011-2-25 at 05:17 ]
6楼2011-02-25 05:16:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 nenyan 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 求调剂院校信息 +6 CX 330 2026-03-21 6/300 2026-03-22 15:25 by 无懈可击111
[考研] 生物学调剂 +5 Surekei 2026-03-21 5/250 2026-03-22 14:39 by tcx007
[考研] 求调剂 +5 Zhangbod 2026-03-21 7/350 2026-03-22 13:13 by Zhangbod
[考研] 考研调剂 +3 呼呼?~+123456 2026-03-21 3/150 2026-03-21 20:04 by 无际的草原
[考研] 材料与化工(0856)304求B区调剂 +3 邱gl 2026-03-20 7/350 2026-03-21 19:05 by 15709483992
[考研] 336求调剂 +5 rmc8866 2026-03-21 5/250 2026-03-21 17:24 by 学员8dgXkO
[考研] 299求调剂 +5 shxchem 2026-03-20 7/350 2026-03-21 17:09 by ColorlessPI
[考研] 求调剂 +3 白QF 2026-03-21 3/150 2026-03-21 13:12 by zhukairuo
[考研] 330求调剂0854 +3 assdll 2026-03-21 3/150 2026-03-21 13:01 by 搏击518
[考研] 南昌大学材料专硕311分求调剂 +6 77chaselx 2026-03-20 6/300 2026-03-21 07:24 by JourneyLucky
[考研] 265求调剂 +3 Jack?k?y 2026-03-17 3/150 2026-03-21 03:17 by JourneyLucky
[考研] 一志愿 西北大学 ,070300化学学硕,总分287,双非一本,求调剂。 +3 晨昏线与星海 2026-03-18 3/150 2026-03-21 00:46 by JourneyLucky
[考研] 274求调剂 +10 S.H1 2026-03-18 10/500 2026-03-20 23:51 by JourneyLucky
[考研] 308求调剂 +3 阿姐阿姐家啊 2026-03-18 3/150 2026-03-20 23:24 by JourneyLucky
[考研] 一志愿 西北大学 ,070300化学学硕,总分287,双非一本,求调剂。 +4 晨昏线与星海 2026-03-19 4/200 2026-03-20 22:15 by JourneyLucky
[考研] 一志愿苏州大学材料求调剂,总分315(英一) +5 sbdksD 2026-03-19 5/250 2026-03-20 22:10 by luoyongfeng
[论文投稿] 申请回稿延期一个月,编辑同意了。但系统上的时间没变,给编辑又写邮件了,没回复 10+3 wangf9518 2026-03-17 4/200 2026-03-19 23:55 by babero
[考研] 一志愿福大288有机化学,求调剂 +3 小木虫200408204 2026-03-18 3/150 2026-03-19 13:31 by houyaoxu
[考研] 有没有道铁/土木的想调剂南林,给自己招师弟中~ +3 TqlXswl 2026-03-16 7/350 2026-03-17 15:23 by TqlXswl
[考研] [导师推荐]西南科技大学国防/材料导师推荐 +3 尖角小荷 2026-03-16 6/300 2026-03-16 23:21 by 尖角小荷
信息提示
请填处理意见