Проблема с чтением строки из файла в C - PullRequest
0 голосов
/ 01 июля 2019

Я пытался найти похожую проблему, но не смог ее найти, поэтому я публикую это.Вот вещьДопустим, у меня есть файл с именем text.txt.Теперь файл состоит из 3 целых чисел и строки, что-то вроде этого:

4 59 32 This is sentence 1
5 9 130 Grass is green
3 12 149 I need help

Я все еще изучаю C, поэтому извините, если это простой вопрос типа и т. Д. Вот проблема.Я не знаю, как это читать.То же самое, если строка находится в начале файла, как этот

This is sentence 1 4 59 32
Grass is green 5 9 130 
I need help 3 12 149 

Я знаю, как его прочитать, если знаю количество слов, из которых оно будет состоять (например, если файл будет выглядеть примерно так:Имя Фамилия Номер Номер Номер) но это когда мне нужно прочитать целиком, я понятия не имею.

Вот код из комментариев.Однако, как указал @john, это неверно с самого начала, так как я получаю первый символ, а затем я делаю scanf (тем не менее, я попробовал и, учитывая только числа, fscanf получает правильные значения, даже если первый символ читается).Я также думал о некотором цикле while с участием isalpha () и isspace (), но безрезультатно.

while((i = fgetc(input)) != (int)(EOF))
    {
        fscanf(inputFile, "%d %d %d", &num1, &num2, &num3);

        j=0;
        while(i != (int)('\n'))
        {
            string[j++]=(char)i;
            i = fgetc(inputFile);
        }
        string[j] = '\0';

        printf("%d %d %d %s\n",br1, br2, br3, string);

1 Ответ

0 голосов
/ 02 июля 2019

это неверно с самого начала, так как я получаю первый символ, а затем делаю scanf

Ты прав, это неправильно. Нет необходимости использовать первый символ строки только для проверки EOF - мы можем оставить это fscanf().
Также нет необходимости читать символы строки один за другим - fscanf() может читать строку, заканчивающуюся на \n со спецификацией преобразования %[^\n].
Если длина входной строки не ограничена, мы должны предотвратить переполнение буфера, когда входной строке потребуется больше памяти, чем предусмотрено string, добавив максимальная ширина поля . Если вы определили e. г. char string[100];, максимальная ширина поля составляет 99, так как последний char необходим для завершающего нулевого символа.
Таким образом, мы могли бы написать е. г.

    while (fscanf(input, "%d %d %d %99[^\n]", &num1, &num2, &num3, string) == 4)
        printf("%d %d %d %s\n", num1, num2, num3, string);
...