Как читать строку из текстового файла в 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();