При чтении файла, как пропустить N-е первые строки

Я написал программу для чтения координат X, Y и Z молекулы из файла (input.xyz) и выполнения некоторой задачи. Однако я хочу, чтобы моя программа пропускала первые две строки, поскольку мой входной файл имеет следующую структуру:

3 
water 
O      -0.73692879      -1.68212007      -0.00000000 
H       0.03427635      -1.68212007      -0.59075946 
H      -1.50813393      -1.68212007      -0.59075946

Я использовал следующий раздел в своем коде

fptr = fopen(filename, "r");
fseek(fptr,3,SEEK_SET);
for(i=0;i<Atom_num;i++)
{
   X[i] = Y[i] = Z[i] = 0;
   fscanf(fptr,"%2s%lf%lf%lf",Atom[i].symbol,&X[i],&Y[i],&Z[i]);
   printf("%2s\t%lf\t%lf\t%lf\n",Atom[i].symbol,X[i],Y[i],Z[i]);
}
fclose(fptr);

Где Atom_num — первая строка input.xyz

Однако printf показывает следующий вывод

at  0.000000    0.000000    0.000000 
er  0.000000    0.000000    0.000000  
O   -0.736929   -1.682120   -0.000000

Я не знаю, почему fseek() не работает. Кто-нибудь может мне с этим помочь?


person JohnP    schedule 16.06.2020    source источник
comment
Вы можете прочитать каждую строку с помощью fgets и извлечь информацию с помощью sscanf. Таким образом, вы можете просто пропустить столько строк, сколько пожелаете. Не используйте fseek.   -  person Weather Vane    schedule 16.06.2020
comment
Добавить if(i > 1) перед printf?   -  person kabanus    schedule 16.06.2020
comment
fseek позиционирует указатель файла не на n-й строке, а на n-м байте.   -  person Jabberwocky    schedule 16.06.2020


Ответы (2)


Посмотрите на подпись fseek():

int fseek(FILE *stream, long int offset, int whence)

особенно при определении смещения

смещение — это количество байтов для смещения, откуда.

Итак, когда вы делаете:

fseek(fptr,3,SEEK_SET);

вы просто пропускаете 3 байта во входном файле.

Что вы хотите сделать, это что-то вроде этого:

char line[256]; /* or other suitable maximum line size */
while (fgets(line, sizeof line, file) != NULL) /* read a line */
{
    if (count == lineNumber)
    {
        //Your code regarding this line and on, 
          or maybe just exit this while loop and 
          continue reading the file from this point.
    }
    else
    {
        count++;
    }
}
person Arie Charfnadel    schedule 16.06.2020
comment
В качестве альтернативы рассмотрите возможность использования (в реализациях, в которых они есть) getline(3) или readline(3) - person Basile Starynkevitch; 16.06.2020
comment
Мне было интересно, что означает строка [256]? Означает ли это 256 символов строки? - person JohnP; 16.06.2020
comment
Да, это просто какое-то случайное значение. Я предполагал не более 256 символов в одной строке, поэтому я сделал буфер для чтения строки такого размера. - person Arie Charfnadel; 16.06.2020

-- Подход fgets() --

это можно сделать с помощью fgets. с сайта man7.org: см. здесь fgets

Функция fgets() должна считывать bytes из stream в массив, на который указывает s, в нашем случае указанный line, до тех пор, пока не будет прочитано n−1 bytes, или <newline> не будет прочитано и передано в line, или не встретится условие end-of-file, EOF. Затем строка завершается байтом null.

#include <stdio.h>
#define LINES_TO_SKIP   3
#define MAX_LINE_LENGTH 120

int main () {
   FILE *fp;
   char line[MAX_LINE_LENGTH];  /*assuming that your longest line doesnt exceeds MAX_LINE_LENGTH */
   int line_c = 0;

   /* opening file for reading */
   fp = fopen("file.txt" , "r");
   if(fp == NULL) 
   {
      perror("Error opening file");
      return(-1);
   }
   
   while(( fgets (line, MAX_LINE_LENGTH, fp)!=NULL )
   {
      if(line_c < LINES_TO_SKIP)
      {
        ++line_c;
        puts("Skiped line");
      }
      else
      {
        /*
         ... PROCESS The lines...
       */
      } 
   }
   
   fclose(fp);
   
   return(0);
}
person nor    schedule 16.06.2020