Как взять первую строку из этого списка текста? - PullRequest
1 голос
/ 09 мая 2020

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

#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;
}

Ответы [ 3 ]

5 голосов
/ 09 мая 2020

Ваше условие остановки: 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, в качестве альтернативы загрузите переносную версию , и, конечно, вы можете сделайте свой, например этот или этот .

2 голосов
/ 09 мая 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() может автоматически выделять ваш буфер чтения , если вы wi sh.
  • getline() возвращает конец разделителя строки. Вы всегда можете отключить его, если не хотите.
  • Это ВСЕГДА хорошая идея проверять статус вызовов ввода-вывода, например «fopen ()».
2 голосов
/ 09 мая 2020

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

#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;
}

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

Edit1: char c; в строке 5 инициализируется как '' для работы с UB.

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

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

...