我花了很长时间寻找答案,但我没有找到解决问题的方法。我是C的新手。
代码读取两个大型目录并比较它们之间的值,然后将各种结果写入多个数据文件。运行时间为5分钟到2小时,具体取决于目录。
这个问题是:程序在结束之前就会停止运行。我收到消息“filename.exe已停止工作”。我不认为这是一个scanf赋值问题,因为我的所有变量都是字符串。我使用-Wall选项进行编译,它编译得很好,我得到的唯一警告是“使用fopen_s”或“使用fscanf_s”,我听说这并不重要。当我检查输出文件时,它们比它们应该短1-3行,并在一行中途停止。我认为它可能与我的while循环中的EOF有关,但实际上我已经搞乱了很长时间,我无法理解它。
这不是我的代码,而是其他人发给我的代码,我必须重新使用。我正在使用VS Studio命令提示符进行编译。我用notepad ++编辑文件。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define ANG_DIST_LIMIT 100 /* arcsecond */
void main(void)
{
FILE *in1, *in2, *out1, *out2, *out_str, *out_str_mul, *out_non, *out_non_1 ;
char cid1[20], cx[18], cy[18], cz[18], cmag[5], cra[12], cde[12],
cpmr[12], cpmd[12], cpu[12], cme[6], ccolor[2], cid2[4],
cid0_[7], cid_[9], cra_[13], cde_[13], cmg_[6], cmf_[3] ;
int lrs_id, id_l, id_ist_n, id_gla_n, mfg_n, star_cnt ;
double ra_l, dec_l, mag_l, ra_n, dec_n, mag_n, mag_err,
ra_diff, de_diff, de_sum, ang_dist, PI;
in1 = fopen("filepath1.txt", "r") ;
in2 = fopen("filepath2.cat", "r") ;
out1 = fopen("filepath3.dat", "w") ;
out2 = fopen("filepath4.dat", "w") ;
out_str = fopen("filepath5.dat", "w") ;
out_str_mul = fopen("filepath6.dat", "w") ;
out_non = fopen("filepath7.dat", "w") ;
out_non_1 = fopen("filepath8.dat", "w") ;
PI = 3.141592653589 ;
lrs_id = 0 ;
// Read from first catalog until end of file
while (fscanf(in1, "%s", cid1) != EOF)
{
fscanf(in1, "%s %s %s %s %s %s %s %s %s %s %s %s",
cx, cy, cz, cmag, cra, cde, cpmr, cpmd, cpu, cme, ccolor, cid2) ;
lrs_id++ ;
id_l = atoi(cid2) ;
ra_l = atof(cra) ;
dec_l = atof(cde) ;
mag_l = atof(cmag) ;
mag_err = atof(cme) ;
star_cnt = 0 ;
// For each item in catalog 1, find an item in catalog 2 that matches
while ( fscanf(in2, "%s", cid0_) != EOF)
{
fscanf(in2, "%s %s %s %s %s", cid_, cra_, cde_, cmg_, cmf_) ;
id_ist_n = atoi(cid0_) ;
id_gla_n = atoi(cid_) ;
ra_n = atof(cra_) ;
dec_n = atof(cde_) ;
mag_n = atof(cmg_) ;
mfg_n = atoi(cmf_) ;
ra_diff = (ra_l - ra_n)/180.*PI ;
de_diff = (dec_l - dec_n)/180.*PI ;
de_sum = (dec_l + dec_n)/180.*PI ;
ang_dist = sqrt(de_diff*de_diff +cos(de_sum/2.)*ra_diff*ra_diff)*180./PI ;
if (ang_dist < 1.0)
fprintf(out1, "%5d %10.3f %12.8f %12.8f %12.8f %12.8f %5d\n",
lrs_id, ang_dist*3600.0, ra_l, dec_l, ra_n, dec_n, id_ist_n) ;
if (ang_dist*3600.0 < ANG_DIST_LIMIT)
{
star_cnt++ ;
fprintf(out2, "%5d %8.3f %12.8f %12.8f %12.8f %12.8f %5d\n",
lrs_id, ang_dist*3600.0, ra_l, dec_l, ra_n, dec_n, id_ist_n) ;
}
}
if (star_cnt > 0)
{
fprintf(out_str, "%4d %3d %8.3f %8.3f %6.2f\n",
lrs_id, star_cnt, ra_l, dec_l, mag_l) ;
if (star_cnt > 1)
fprintf(out_str_mul, "%4d %3d %8.3f %8.3f %6.2f\n",
lrs_id, star_cnt, ra_l, dec_l, mag_l) ;
}
else
{
fprintf(out_non, "%4d %3d %8.3f %8.3f %6.2f\n",
lrs_id, star_cnt, ra_l, dec_l, mag_l) ;
fprintf(out_non_1, "%19s %20.15f %20.15f %20.15f %8.2f %12.8f %14.8f %14.8f %14.8f %15.6f %7.4f %2d %8d\n",
cid1, atof(cx), atof(cy), atof(cz), mag_l, ra_l, dec_l, atof(cpmr), atof(cpmd), atof(cpu), atof(cme), atoi(ccolor), id_l) ;
}
rewind (in2) ;
}
}
由于代码的性质,我不使用很多变量。
如果我没有得到一个明显的问题,我道歉。我已尽我所能,任何帮助都会受到赞赏。我会提供我遗漏的任何细节。