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

16
задан a_m0d 20 June 2010 в 23:46
поделиться

4 ответа

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

Если есть вероятность, что у вас могут быть действительно очень длинные строки и вам нужно обрабатывать строку за строкой, вы можете выделить подходящий буфер и использовать 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;
}
18
ответ дан 30 November 2019 в 15:25
поделиться

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

7
ответ дан 30 November 2019 в 15:25
поделиться

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

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

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

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

 file1.close();
4
ответ дан 30 November 2019 в 15:25
поделиться

В C++ вы можете использовать глобальную функцию 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, поэтому немного заржавел, но я думаю, что вы можете использовать это для эмуляции функциональности вышеупомянутой программы на 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;
}

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

22
ответ дан 30 November 2019 в 15:25
поделиться