0

我正在将一个文本文件重定向到我的 C 程序中,例如

./test.c < earthquakes.txt

我用这样的scanf读入了我需要的数据:

while (scanf("%4d-%2d-%2d%c%2d:%2d:%2d+%2d:%2d,%f,%f,%f,%f",
    &yyyy, &mm, &dd, &junkc, &hh, &min, &sec, &junki, &junki,
    &latit, &longi, &depth, &magnitude) == 13) {
    printf("test\n");
    num_earthquakes++;
}

直到我读完我需要的所有行。之后,我如何倒回到标准输入的开头?

4

3 回答 3

2

stdin是一个流而不是一个常规文件,所以你不能只是倒带输入。

所以我想,你应该定期读取文件,或者如果你想将接收到的数据复制到缓冲区,以便再次读取它。

于 2013-04-21T15:00:24.463 回答
1

也许只通过一次是最好的选择:读取值,并realloc在必要时使用调整数组大小。为了最大程度地减少因大量输入而出错的机会,您需要只存储解决问题所需的信息。如果输出基于月份,则基于月份收集信息。例如:

size_t count = 0;
struct month_stat *month = NULL;
while (count <= SIZE_MAX / sizeof *month &&
       scanf("%4d-%2d-%2d%c%2d:%2d:%2d+%2d:%2d,%f,%f,%f,%f",
             &yyyy, &mm, &dd, &junkc, &hh, &min, &sec, &junki, &junki,
             &latit, &longi, &depth, &magnitude) == 13)
{
    /* resize based upon powers of two for simplicity */
    if (count & (count - 1) == 0)
    {
        void *temp = realloc(month, (count * 2 + 1) * sizeof *month);
        if (temp == NULL)
        {
            /* handle error */
        }

        month = temp;
    }

    /* TODO: Update month[count] and overall stats
     *       When the month changes, you'll want to count++;
     */
}

您是否知道可以通过在您使用的格式说明符和您使用*的任何格式说明符之间放置一个来告诉 scanf 丢弃输入%?例如,assert(scanf("%*c") == 0);将读取并丢弃没有赋值的字符,这反映在返回值上。

于 2013-04-21T17:00:59.397 回答
0

一种可能的方法是,在第一堂课中,在记忆中建立一个表示。例如,您创建一个与每一行对应的链表,并且元素是您自己的结构。

这样,一次又一次地阅读,你有一种有趣且方便的方式来使用它们。

于 2013-04-21T15:16:06.353 回答