Чтение нескольких разных слов / чисел из строк файла - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь прочитать строку текста из файла (пример ниже).Каждая строка текста имеет: название книги (начинается с заглавной буквы, может состоять из нескольких слов), номер книги, страна происхождения книги (начинается с заглавной буквы) и каталог книги (начинается с заглавной буквы, можетбыть несколькими словами).Каждая строка заканчивается на \ n, и начинается следующая строка.Я хочу прочитать строку и разделить заголовок, номер, страну и название.Как это сделать правильно?

Я пытался читать символ за символом, и когда символ, который я сейчас читаю, является либо цифрой, либо заглавной буквой, а предыдущий символ был "пробелом", флаг должен подниматься, чтобы сигнализироватьЯ должен перейти, например, от заголовка к номеру, от номера к стране и т. Д. Когда я читаю «\ n», все флаги должны идти вниз и процесс должен начинаться заново

void openfile(char* filedestination)
{
FILE *file = fopen(filedestination, "r+");
int help[100];
int c;
int name[100];
char title[50];
int country[50];
int number[6];
int i = 0, flagt = 0 , flagn = 0 , flagc = 0, flagname = 0;
if (file == NULL)
{
    printf("Opening error");
    exit(-1);
}
while((c = fgetc(file))!=EOF)
{

    help[i] = c;
    if (flagt == 0) {
        for (int j = 0; j < i; j++) {
            name[j] = help[j];
            if (c > 47 && c < 91 && help[i - 1] == 32) {
                flagt = 1;
                j = 100;
            }
        }
    }
    if (flagc == 0)
    {
        int j = 0;
        while (flagc == 0) {
            number[j] = help[i];
            if (c > 47 && c < 91 && help[i - 1] == 32) {
                flagc = 1;
            }
            j++;
            i++;
        }

    }
    i++;
    printf("\n");
    for (int j = 0; j < i; j++) {

        printf("%c", name[j]);

    }
    for (int j = 0; j < i; j++) {

        printf("%c", country[j]);
    }
    fclose(file);
}
}

Пример строки:

Горы 10002 Франция Чудеса природы

Фотонные кристаллы 10003 Германия Наука

Итак, я должен получить название = Горы, число = 10002, страна = Франция, название = Чудеса природы.Затем я буду использовать его в другой функции, поэтому я могу перезаписать имя после прочтения его из первой строки, потому что оно мне не понадобится.

1 Ответ

1 голос
/ 05 июня 2019

Что ж, это не очень хороший вопрос для SO, потому что в нем отсутствует контекст того, что вы действительно пытаетесь сделать.Во всяком случае, я посмотрел на ваш код, но было бы слишком много вещей, чтобы исправить для SO ответа.Поэтому я просто дам вам несколько советов.

  • Лучший инструмент для начинающих - это карандаш и лист бумаги.Запишите алгоритм, которому вы хотите, чтобы ваша программа следовала, и контролируйте (да, на бумаге), который должен работать, следуя ему с исходными данными.Если бы вы сделали это, вы бы сразу обнаружили, что он содержит бесконечный цикл, начинающийся с while (flagc == 0) {, потому что c никогда не изменяется в этом цикле.Начинайте кодировать только тогда, когда вы действительно знаете, что хотите

  • Вы пытаетесь проанализировать файл по одному символу за раз.Это не очень сложно, но требует много внимания.Как новичок, я бы посоветовал вам использовать как можно больше функций более высокого уровня из стандартной библиотеки: читайте файл построчно с помощью fgets, а затем используйте strcspn и strspn, чтобы найти положение числа влиния.Прежде всего стоит заголовок, а после - имя.

  • Будьте осторожны с отступами (многие IDE или редакторы могут автоматически делать отступы для вашего кода).Если бы файл был правильно с отступом, вы бы сразу увидели, что вызов fclose был внутри основного цикла.Таким образом, ваш текущий код закрывает файл после первого символа.

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

    open file
    loop line by line
        extract title, number and name from a line
        process title, number and name
    close file
    

    , а затем запишите алгоритм синтаксического анализа, чтобы извлечь поля из строки

  • , когда что-то идет не так (дадаже если вы последуете моим советам ...), они будут использовать отладчик для пошагового выполнения кода.Бесконечный цикл был бы очевиден, если бы у вас было ...

  • менее важно, но хорошие практики рекомендуют избегать магических чисел в коде.Вам приятно знать таблицу кодов ascii, но ' ' для пробела легче читать, чем 32. По крайней мере, вы сразу знаете, что это символ, а не истинное число ...

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

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