0

我正处于编写家庭作业的早期阶段。更大的目标有点大,超出了这个问题的范围。近期目标是从命令行获取一个或多个与年份相对应的两位数(例如 52)。然后打开那一年的文件。文件格式如下:

    1952 Topps baseball
    -------------------
      8  10  15  17  20  47  48  49  59  71  136
    153 155 159 162 168 170 175 176 186 188 202
    215 233 248 252 253 254 257 259 264 270 271 272 274
    282 283 284 285 287 293 294 295 297 299 300 308 310 311
    312

每个文件都有一个随机(1-50 之间)的 1-3 位整数。我将年份存储在一个 int 中。然后我将后面的每个数字存储到一个数组中。然后我将使用该数组来做其他很酷的事情。我的问题是,如何从文件中扫描随机数量的整数输入。这是我到目前为止所做的:

    #include <stdio.h>
    #include <string.h>

    main(int argc, char** argv) {

        char filename[30];
        int cards[100];
        FILE *fp;
        int year,n,i;


        for (i=1; i<argc; i++) {

            n=atoi(argv[i]);

            sprintf (filename,"topps.%d",n);

            if (!(fp=fopen(filename,"r"))){
                printf("cannot open %s for reading\n",filename);
                 exit(3);
            }

            fscanf (fp, "%d%*s%*s%*s%d%d%d%d%d%d%d%d%d%d%d%d",
                    &year,
                    &cards[i],
                    &cards[i+1],
                    &cards[i+2], //this is what needs to be improved upon
                    &cards[i+3],
                    &cards[i+4],
                    &cards[i+5],
                    &cards[i+6],
                    &cards[i+7],
                    &cards[i+8],
                    &cards[i+9],
                    &cards[i+10],
                    &cards[i+11],
                    &cards[i+12]);

            printf ("%d\n",year);
            printf ("%d\n",cards[i+11]);
        }
    }

当前的 fscanf 只是一种权宜之计,以确保我可以阅读和打印信息。它最多存储第 12 个整数并打印它。出于显而易见的原因,我不想参加第 50 届,因为这毫无意义。有些文件中只有 2 或 3 个数字。任何人都可以帮助指导我找到更理想的解决方案来阅读这样的文件吗?谢谢你看。

4

2 回答 2

1

像这样的东西可以解决问题:

在顶部声明 3 个新变量:

char sData[10000];
char * pch;
int j = 0;

然后将您的号码阅读代码替换为以下代码段:

fscanf (fp, "%d%*s%*s%*s", &year);
/* ignore the line with all the dashes (crude, but works)*/
fgets(sData, 10000, fp);
/* read all the number data in */
fgets(sData, 10000, fp);

pch = strtok (sData," ");
j = 0;
while (pch != NULL)
{
    cards[j++] = atoi(pch);
    pch = strtok (NULL, " ");
}

在这段代码的末尾,cards[] 应该包含你所有的数字,j 应该包含计数。

于 2013-10-12T03:22:27.160 回答
0

我非常感谢大家对我的帮助。它绝对引导我走上正确的道路。但是,这是最终对我有用的问题的答案:

fscanf(fp,"%*[^\n]%*c");                             //Skip first two
fscanf(fp,"%*[^\n]%*c");                             //lines of file

while (!feof(fp)) {                                  //Read ints into array
    fscanf(fp,"%d ",&cards[i++]);
}
于 2013-10-17T00:56:23.887 回答