Как взять первую строку из этого списка текста?

У меня есть список столбцов, содержащих текст, но я просто получаю первую верхнюю строку из этого списка. Как это сделать?

#include <stdio.h>

int main()
{
  FILE *fr;
  char c;
  fr = fopen("prog.txt", "r");
  while( c != EOF)
  {
    c = fgetc(fr); /* read from file*/
    printf("%c",c); /*  display on screen*/
  }
  fclose(fr);
  return 0;
}

person Natasha Bibi    schedule 08.05.2020    source источник
comment
проверить man 3 getline. Может быть, это то, что вы хотите   -  person user12986714    schedule 09.05.2020
comment
while ((c = fgetc(fr)) != EOF) было бы началом - возможно, while ((c = fgetc(fr)) != EOF && c != '\n') было бы тем, что вам нужно, но не совсем понятно, что вы имеете в виду. Или используйте fscanf() для чтения «столбца». Не забудьте проверить, что файл был успешно открыт.   -  person Jonathan Leffler    schedule 09.05.2020
comment
Это не дает мне первый ряд. Я хочу первый ряд.   -  person Natasha Bibi    schedule 09.05.2020
comment
И c должно быть int, а не char, чтобы правильно обрабатывать EOF.   -  person MikeCAT    schedule 09.05.2020


Ответы (3)


Ваше условие остановки EOF, все будет прочитано до конца файла, вам нужно читать до тех пор, пока не будет найден символ новой строки, кроме того, EOF (-1) следует сравнивать с типом int.

Вам понадобится что-то вроде:

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

int main()
{
  FILE *fr;
  int c;

  if(!(fr = fopen("prog.txt", "r"))){ //check file opening
    perror("File error");
    return EXIT_FAILURE; 
  }

  while ((c = fgetc(fr)) != EOF && c != '\n')
  {
    printf("%c",c); /*  display on screen*/
  }
  fclose(fr);
  return EXIT_SUCCESS;
}

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

person anastaciu    schedule 09.05.2020

Для чего бы это ни стоило, вот пример, который использует getline

#include <stdio.h>

int main()
{
  FILE *fr;
  char *line = NULL;
  size_t len = 0;
  ssize_t nread;

  if (!(fr = fopen("prog.txt", "r"))) {
    perror("Unable to open file");
    return 1;
  }
  nread = getline(&line, &len, fr);
  printf("line: %s, nread: %ld\n", line, nread);

  fclose(fr);
  return 0;
}

Некоторые примечания:

  • getline() может автоматически выделять буфер чтения, если хотите.
  • getline() возвращает разделитель конца строки. Вы всегда можете снять его, если не хотите.
  • Рекомендуется ВСЕГДА проверять состояние вызовов ввода-вывода, таких как "fopen()".
person FoggyDay    schedule 09.05.2020
comment
Лучше использовать определенный соответствующий спецификатор printf "%zu" с size_t. Также предложите free(line) - person chux - Reinstate Monica; 09.05.2020

просто замените EOF на '\n' (новая строка char). Чем ваш код будет читаться до перехода на новую строку. Вот как это выглядит:

#include <stdio.h>
int main()
{
  FILE *fr;
  char c = ' ';
  fr = fopen("prog.txt", "r");
  while(c != EOF && c != '\n')
  {
    c = fgetc(fr); /* read from file*/
    if(c != EOF){
          printf("%c",c); /*  display on screen*/
    }
  }
  fclose(fr);
  return 0;
}

Я еще не тестировал его, но, вероятно, работает. Пожалуйста, дайте мне знать, если есть какие-то проблемы с кодом, я его отредактирую.

Редактировать1: символ с; в строке 5 инициализируется как ' ' для работы с UB.

Edit2: добавление условия (c != EOF) в цикл while в строке 7, чтобы не указывать причину бесконечного цикла.

Edit3: добавление оператора if в строку 10, чтобы не печатать EOF, что может быть причиной странных результатов.

person Baran SAHİN    schedule 09.05.2020
comment
код будет считываться до тех пор, пока не достигнет новой строки --›, если только сначала не произойдет EOF. Тогда этот код представляет собой бесконечный цикл. Рассмотрите возможность проверки обоих и используйте int c. - person chux - Reinstate Monica; 09.05.2020
comment
Вам нужно проверить, что было возвращено fgetc(), прежде чем печатать его, потому что попытка печатать EOF дает странные результаты. - person Jonathan Leffler; 09.05.2020
comment
@JonathanLeffler спасибо за ваш комментарий. Я отредактировал ответ. - person Baran SAHİN; 09.05.2020