Faster I/O in C

后端 未结 8 1927
自闭症患者
自闭症患者 2021-02-09 04:40

I have a problem which will take 1000000 lines of inputs like below from console.

0 1 23 4 5
1 3 5 2 56
12 2 3 33 5
...
...

I have used scanf,

8条回答
  •  别跟我提以往
    2021-02-09 05:07

    If your example is representative, that you indeed have a fixed format of five decimal numbers per line, I'd probably use a combination of fgets() to read the lines, then a loop calling strtol() to convert from string to integer.

    That should be faster than scanf(), while still clearer and more high-level than doing the string to integer conversion on your own.

    Something like this:

    typedef struct {
      int number[5];
    } LineOfNumbers;
    
    int getNumbers(FILE *in, LineOfNumbers *line)
    {
      char buf[128];  /* Should be large enough. */
      if(fgets(buf, sizeof buf, in) != NULL)
      {
        int i;
        char *ptr, *eptr;
    
        ptr = buf;
        for(i = 0; i < sizeof line->number / sizeof *line->number; i++)
        {
          line->number[i] = (int) strtol(ptr, &eptr, 10);
          if(eptr == ptr)
            return 0;
          ptr = eptr;
        }
        return 1;
      }
      return 0;
    }
    

    Note: this is untested (even uncompiled!) browser-written code. But perhaps useful as a concrete example.

提交回复
热议问题