mercredi 27 septembre 2017

std::cin error for large file

I was benchmarking some I/O code with large input( 1Mb text file of integer, separated by tab, spaces or endline) then the normal cin method

int temp;
cin >> temp;
while(temp!=0){ cin >> temp;}

Got into an infinite loop with temp value at 15 , there is no such long sequences in the input file however

The cooked up integer parsing method, with fread however did just fine with a clock time of around 0.02ms

void readAhead(size_t amount){
  size_t remaining = stdinDataEnd - stdinPos;
  if (remaining < amount){
    memmove(stdinBuffer, stdinPos, remaining);

    size_t sz = fread(stdinBuffer + remaining, 1, sizeof(stdinBuffer) - remaining, stdin);

    stdinPos = stdinBuffer;

    stdinDataEnd = stdinBuffer + remaining + sz;

    if (stdinDataEnd != stdinBuffer + sizeof(stdinBuffer)){
      *stdinDataEnd = 0;
    }
  }
}

int readInt(){
  readAhead(16);

  int x = 0;
  bool neg = false;
  // Skipp whitespace manually
  while(*stdinPos == ' ' || *stdinPos == '\n' || *stdinPos == '\t'){
    ++stdinPos;
  }

  if (*stdinPos == '-') {
    ++stdinPos;
    neg = true;
  }

  while (*stdinPos >= '0' && *stdinPos <= '9') {
    x *= 10;
    x += *stdinPos - '0';
    ++stdinPos;
  }

  return neg ? -x : x;
}

Any direction on how might cin get stuck ?

Aucun commentaire:

Enregistrer un commentaire