从文件中读取无限数量的整数

时间:2013-10-12 02:52:35

标签: c io

我正处于编写家庭作业的早期阶段。更大的目标是更大,超出了这个问题的范围。直接目标是从命令行获取一个或多个两位数字,这些数字对应于年份(例如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个数字。谁能帮助我指导一个更理想的解决方案来阅读这样的文件?谢谢你看看。

2 个答案:

答案 0 :(得分:2)

这样的事情可以解决问题:

在顶部声明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应包含计数。

答案 1 :(得分: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++]);
}