Как читать строку из текстового файла в c/С++?

После исчерпывающего поиска и посещения многих форумов мне еще предстоит найти исчерпывающий ответ на этот вопрос. Многие форумы предлагают использовать линию get istream& getline (char* s, streamsize n ). Мой вопрос в том, что, если я не знаю, какова длина каждой строки и не может предсказать, какой размер может быть? И что это эквивалентно в C?

Есть ли какая-либо конкретная функция в c/С++ для чтения одной строки каждый раз из текстового файла?

Объяснение, с фрагментами кода мне очень поможет.

Ответ 1

В c вы можете использовать fopen и getch. Обычно, если вы не можете точно знать длину самой длинной строки, вы можете выделить большой буфер (например, 8kb) и почти гарантировать получение всех строк.

Если у вас есть шанс, что у вас действительно действительно длинные очереди, и вам нужно работать последовательно, вы можете malloc создать резонансный буфер и использовать realloc, чтобы удвоить размер каждый раз, когда вы приблизитесь к его заполнению.

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

void handle_line(char *line) {
  printf("%s", line);
}

int main(int argc, char *argv[]) {
    int size = 1024, pos;
    int c;
    char *buffer = (char *)malloc(size);

    FILE *f = fopen("myfile.txt", "r");
    if(f) {
      do { // read all lines in file
        pos = 0;
        do{ // read one line
          c = fgetc(f);
          if(c != EOF) buffer[pos++] = (char)c;
          if(pos >= size - 1) { // increase buffer length - leave room for 0
            size *=2;
            buffer = (char*)realloc(buffer, size);
          }
        }while(c != EOF && c != '\n');
        buffer[pos] = 0;
        // line is now in buffer
        handle_line(buffer);
      } while(c != EOF); 
      fclose(f);           
    }
    free(buffer);
    return 0;
}

Ответ 2

В С++ вы можете использовать глобальную функцию std:: getline, она берет строку и поток и необязательный разделитель и читает 1 строку до тех пор, пока не будет указан указанный разделитель. Пример:

#include <string>
#include <iostream>
#include <fstream>

int main() {
    std::ifstream input("filename.txt");
    std::string line;

    while( std::getline( input, line ) ) {
        std::cout<<line<<'\n';
    }

    return 0;
}

Эта программа считывает каждую строку из файла и выводит ее на консоль.

Для C вы, вероятно, смотрите на использование fgets, прошло некоторое время с тех пор, как я использовал C, то есть я немного ржавый, но я считаю, что вы можете использовать его для эмуляции функциональности вышеуказанной программы на С++ так:

#include <stdio.h>

int main() {
    char line[1024];
    FILE *fp = fopen("filename.txt","r");

    //Checks if file is empty
    if( fp == NULL ) {                       
        return 1;
    }

    while( fgets(line,1024,fp) ) {
        printf("%s\n",line);
    }

    return 0;
}

С ограничением, что линия не может быть длиннее максимальной длины буфера, в который вы читаете.

Ответ 3

В C, fgets(), и вам нужно знать максимальный размер, чтобы предотвратить усечение.

Ответ 4

im не очень хорошо на C, но я считаю, что этот код должен довести вас до полной длины до конца...

 #include<stdio.h>

 int main()   
{      
  char line[1024];    
  FILE *f=fopen("filename.txt","r");    
  fscanf(*f,"%[^\n]",line);    
  printf("%s",line);    
 }    

Ответ 5

getline() - это то, что вы ищете. Вы используете строки в С++, и вам не нужно заранее знать размер.

Предполагая пространство имен std:

 ifstream file1("myfile.txt");
 string stuff;

 while (getline(file1, stuff, '\n')) {
      cout << stuff << endl;
 }

 file1.close();