Как переместить указатель позиции на следующую строку в файле с помощью fseek - PullRequest
0 голосов
/ 05 мая 2018

Я видел программы для обработки файлов и в одной из программ, использующих fseek, как показано ниже:

/* This example opens a file myfile.dat for reading.
   After performing input operations (not shown), it moves the file
   pointer to the beginning of the file.
*/

#include <stdio.h>

int main(void)
{
   FILE *stream;
   int result;

   if (stream = fopen("myfile.dat", "r"))
   { /* successful */

   if (fseek(stream, 0L, SEEK_SET));  /* moves pointer to   */
                                  /* the beginning of the file */
   { /* if not equal to 0
             then error ...    */
   }
   else {
       /* fseek() successful  */
   }
}

Таким образом, можно переместить указатель файла на следующую строку сразу после этой строки

BO_ 377 FC_DM_MISC: 8 FC SG_ DATA3 m11 : 31|8@0+ (1,0) [0|0] "" DM

Это две строки, и я хочу запрограммировать таким образом, чтобы при определении числа 377 указатель теперь переходил к следующей строке, т. Е. К строке SG_ DATA3, несмотря на пробелы после 8 FC. Как можно сделать это, используя fseek в C?

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Попробуйте этот код. Это может вам помочь. Здесь каждая строка входного файла преобразуется в string , поскольку манипулирование строками очень просто по сравнению со сложной функцией fseek(). Это может быть не идеальным ответом но это будет очень простое решение.

#include <stdio.h>
#include <string.h>

int main(void)
{
    FILE *stream;
    int result;

    char tmp[100]; // assuming that max length of a line in myfile.dat is 100.

    if (stream = fopen("myfile.dat", "r"))
    { /* successful */
        fscanf(stream, "%100[^\n]", tmp); // assuming that max length of a line in myfile.dat is 100.
        printf("%s", tmp);
        if (strstr(tmp, "377"))
        { // check for 337

            fscanf(stream, "%100[^\n]", tmp); // next line is in the string tmp .

            // continue your program.
            //printf("%s", tmp);
        }
    }
}
0 голосов
/ 05 мая 2018

fseek используется для двоичных данных, если вы работаете с текстовым файлом, вы должны использовать либо fgets, либо getline (рекомендуется использовать getline).

Существует открытое обсуждение "fgets () vs getline", и многие говорят, что "fgets устарела" - это всего лишь пропаганда gcc в пользу их конкретной getline ().

Возможный недостаток fgets() в том, что он ничего не говорит вам, если читаются нулевые байты, что вы можете избежать с помощью getline().

Но опять же, если вам не нравится gcc или вы используете что-то другое, используйте fgets(). Если вы застряли с gcc, используйте getline().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...