получить 3 (макс.) di git целое число из текстового файла - PullRequest
0 голосов
/ 18 июня 2020

Прежде всего, я новичок в файлах в c, так что это может быть простой вопрос,
, но я все еще не нашел решения:

скажем, это содержимое моего файл:

99

бла-бла

...

...


Я хочу сканировать только номер с начала (он всегда в отдельной строке)

У меня вопрос, как это сделать примите число (99) как одно число и прекратите сканирование.

    int main(){

        FILE* fp = fopen(file_name, "r");
        int integer;
        ...

        fclose(fp);

        printf("%d", integer);
    }

вывод для примера файла:

99

- число может быть от 1 до 100 -

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Почему бы не использовать scanf? (fscanf, чтобы быть более точным):

В случае успеха функция возвращает количество успешно заполненных элементов списка аргументов.

(источник: cppreference ) Так что просто проверьте, сколько значений вы прочитали, если 0 означает, что это не число, поэтому вы можете просто пропустить эту строку, для этого вы можете использовать префикс «% *», чтобы игнорировать данные. Вы также сказали:

Я хочу сканировать только номер с самого начала (он всегда находится в отдельной строке)

, поэтому после прочтения номера просто пропустите целая строка с "% * [^ \ n]" (считывает данные
до тех пор, пока не встретится символ новой строки)

int num;
int scanReturn;

FILE* f = fopen("file.txt", "r");

...

do {
    scanReturn = fscanf(f, "%d", &num);

    if(scanReturn == 0)
    {
        scanReturn = fscanf(f, "%*s");
    }
    else if(scanReturn != EOF)
    {
        fscanf(f, "%*[^\n]");
        printf("%d, ", num);
    }

} while(scanReturn != EOF);

fclose(f);
0 голосов
/ 18 июня 2020

Я хочу сканировать только число с самого начала ( он всегда находится в отдельной строке ).

Это хороший совет, предлагающий строку строковый синтаксический анализ ввода. Вы можете использовать комбинацию fgets (1) и sscan (2) , чтобы прочитать это число.

fgets будет читать до определенное количество символов из потока и сохранить эти символы в буфере. Если он находит новую строку, он прекращает чтение, сохраняет новую строку в буфере, за которым следует нулевой символ конца. В противном случае добавляется только терминатор. В случае сбоя он возвращает NULL-указатель.

sscanf работает в основном как scanf или fscanf, но читает из массива символов, а не из потока.

Также лучше всегда проверять возвращаемое значение этой библиотечной функции.

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

#define BUF_SIZE 1024

int main(void)
{
    char const *file_name = "data.txt"; 
    FILE *in_file = fopen(file_name, "r"); 
    if (!in_file) {
        fprintf(stderr, "Error while reading \"%s\": %s", file_name, strerror(errno));
        return EXIT_FAILURE;
    }

    char buffer[BUF_SIZE];
    int number = 0;
    while( fgets(buffer, BUF_SIZE, in_file) ) {
        if ( sscanf(buffer, "%d", &number) == 1 ) {
            if ( 0 < number  &&  number < 100 ) {
                printf("%d", number);
                break;
            }
        }
    }

    fclose(in_file);
    return EXIT_SUCCESS;
}

Пример .

Некоторые ссылки на функции, использованные в предыдущем фрагменте

1) fgets: man- pages или cppreference .

2) sscanf: man-pages или cppreference

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