2014-10-01 3 views
0

Хорошо, так что прошло некоторое время с тех пор, как я испортил чтение и запись файла, и я почти забыл все, что узнал. Итак, я сейчас просто пытаюсь понять, как читать определенные строки из текстового файла и выводить эту строку в командную строку. Вот мой код, я имею проблемы с:Как читать отдельные строки текстового файла с помощью C++

#include <iostream> 
#include <fstream> 
using namespace std; 

int main(){ 
ifstream input; 
int lineN=0; 
string line[lineN]; 
input.open("input.txt"); 

getline(input, line[lineN]); 
cout << line[lineN]; 
} 

Как это в настоящее время, он будет читать первую строку текстового файла не проблема. Однако, если я изменяю переменную lineN (которая обозначает номер строки) на 1 для чтения второй строки, она вызывает запрос. Я понятия не имею, что это такое, я делаю неправильно. Я попытался изучить эту проблему, но ответ каждого слишком расплывчатый (это или я просто слишком тупой). Если бы вы могли мне помочь, это здорово.

+0

ломаная линия [5] будет определять массив размером 5, с доступными индексами [0] - [4], примечание [5] является _not_ действительным индекс. То, что ваша программа не разбивается с помощью строкиN = 1, является чистой «удачей». В любом случае, это просто говорит getline, где хранить то, что он читает, а не от того, где его читать. Таким образом, вы всегда будете читать первую строку текстового файла. И getline, никогда не получающий значение «lineN», должен быть абсолютно очевидным и самоочевидным для вас, если он не пытается снова изучить основы областей и вызовов функций. – cooky451

+1

'getline (input, line [lineN]);' - Вы получаете доступ к элементу за пределами массива, что приводит к неопределенному поведению. –

+0

Это не должно даже компилироваться: 'std :: string line [lineN];' не является законным в C++. Вы компилируете в C++, не так ли? (Со всеми компиляторами, которые я знаю, вам нужны специальные опции для компиляции на C++, а не на какой-то пользовательский язык, полученный из C++.) –

ответ

3

Проблема заключается в том, что вы определяете здесь пустой массив строк и массивы не являются динамическими:

int lineN=0; 
string line[lineN]; 

при изменении lineN на 1, ничего не меняется в массиве, и вы получите из границы!

bettter способом было бы использовать vectors:

vector<string> line; 

Чтение во временной последовательности:

string current_line; 
getline(input, current_line); 

и добавить его в векторе:

line.push_back(current_line); 

Положив все это в хорошем цикле было бы более полезным:

string current_line; 
while (getline(input, current_line)) { 
     line.push_back(current_line); 
} 

Вы можете получить доступ к любой строке позже, используя line[i] именно с вашим массивом, до тех пор, пока i< line.size(). Или вы можете легко перебирать через в все ее содержание:

for (string x : line) { // means for every x in line[] 
    cout<< x<<endl; 
} 
Смежные вопросы