Как использовать указатели в сочетании с getc? - PullRequest
2 голосов
/ 29 сентября 2010

У меня есть функция getNum (), которая получает число из файла и возвращает его.Когда я возвращаюсь в getNum (), я потерял указатель, и он снова начинается с начала файла.Мне интересно, как мне узнать, где находится getc, а затем вернуться в это место.Я не мог найти, как это сделать, в руководстве или на форумах.Спасибо.

#include <stdio.h>
#include <stdlib.h>

int getNum();
int getLine();
int getMatrix();



main() {
int num;
int two;
num = getNum();
printf("%d\n", num);
two = getNum();
printf("%d\n", two);

}

int getNum() {
  FILE *infile;
    infile = fopen("matrix.txt","r");
  int c;
  double value = 0;

  while ((c=getc(infile)) != '\n') {
    if(c==32){
      if(value != 0){
        return(value);
      }
      //otherwise keep getting characters
    }
    else if ((c<=47)||(c>=58)){
      printf("incorrect number input %d\n", c);
      exit(1);
    }
    else {
      value = (10*value) + c - '0';
    }
  }
  return(value);
}

Ответы [ 4 ]

3 голосов
/ 29 сентября 2010

Причина в том, что вы открываете файл каждый раз, когда выполняете getNum.Когда вы открываете файл для чтения, он запускается в начале файла.Вместо этого откройте его только один раз.

int main(int argc, char *argv[])
{
  ...
  FILE *infile;
  ...
  infile = fopen("matrix.txt","r");
  ...
  getNum(infile)
  ...
  fclose(infile);
  return 0;
}


int getNum(File *infile)
{
  // Same as before, just no file opening.
}
2 голосов
/ 29 сентября 2010

Вы открываете файл каждый раз, когда вызываете getNum, поэтому, естественно, вы снова в начале.

Вместо этого откройте файл в главном файле и передайте ФАЙЛ * в getNum ().

1 голос
/ 29 сентября 2010

Что-то вроде:

int getNum( FILE* fp );
...

int n;
FILE* file = fopen( "file.txt" );
assert( file );
do {
    n = getNum( file );
    /* ... */
}
while ( n != -1 ); /* or something */
fclose( file );
1 голос
/ 29 сентября 2010

Вы открываете файл заново при каждом вызове функции.Вновь открытый файл начинает сканирование с самого начала.

Альтернативой может быть один раз открыть файл вне getNum ().Вы можете передать FILE * в getNum () в качестве аргумента.

Кроме того, вы не закрываете файл.Используйте fclose (), чтобы закрыть файл после всех вызовов getNum ().

...