2014-10-08 2 views
-2

В файле с именем abc.txt, у меня есть ввод следующий текст:C++ вектор subsctript из диапазона

sample text 
sample text 
sample text 
sample text 
sample text 

Во-первых, я создал переменную (названный текст) для сохранения text- чтения из файла. Затем программа считывает файл abc.txt. Я создал вектор с именем: ArrSent для сохранения каждой строки из файла abc.txt. После цикла while завершает программу закрыть файл abc.txt. Затем программа должна выводить все предложения из векторного ArrSent в screnn.I есть такая проблема: после завершения программы появляется предупреждение с сообщением: векторный индекс вне диапазона. Я понятия не имею, почему ..

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

using namespace std; 

void function() 
{ 
    string text;//variable to save text from file 
    ifstream myfile("abc.txt");//reading from file colled abc.txt 




    vector<string> ArrSent; 

    if (myfile.is_open()) 
    { 
     //cout <<"myplik.good()= "<< myfile.good() << endl; 

     while (myfile.good()) 
     { 
       getline(myfile, text); 
       ArrSent.push_back(text); 
     } 


     myfile.close(); 
    } 
    for (int i = 0; i <= ArrSent.size(); i++) 
    { 
     cout << ArrSent[i] << endl; 
    } 

} 


int main() 
{ 
    function(); 
    system("pause"); 
    return 0; 
} 
+1

'is_open()' и 'good()' абсолютно бессмысленны, а 'push_back' после вашего' getline' ошибочен, так как вы игнорируете возвращаемое значение. –

+1

Пожалуйста, избавитесь от [system ("pause")] (http://www.gidnetwork.com/b-61.html) - это опасно и не переносится. –

ответ

4

Это неправильно здесь

for (int i = 0; i <= ArrSent.size(); i++) 
{ 
    cout << ArrSent[i] << endl; 
} 

должен быть

for (int i = 0; i < ArrSent.size(); i++) 
{ 
    cout << ArrSent[i] << endl; 
} 

Причиной этого является то, что в C/C++, вектор/массива равны нулю исходя из. То есть, если у вас есть вектор, my_vector, размер 10, он будет выглядеть как my_vector [0], my_vector [1], ... my_vector [9]. Нет my_vector [10].

Лучший способ итерации через него, может быть (C++ 11)

for (const auto & v : ArrSent) 
{ 
    cout << v << endl; 
} 

или

for (vector<string>::const_iterator i = ArrSent.begin(); i != ArrSent.end(); ++i) 
    cout << *i << endl; 

Как указывает WhozCraig, в то время как петля для чтения также детская коляска, лучший вариант может быть

while (getline(myfile, text)) 
    { 
     ArrSent.push_back(text); 
    } 

A Word О function

Примечание: Ваше имя функции function. Хотя это может быть описательным, вы должны знать, что стандартные заголовки библиотек могут свободно включать другие стандартные заголовки библиотекиочень часто делают именно это). Один из таких заголовков в стандартной библиотеке - <functional>, который объявляет, как повезло, std::function.

Зачем вам это нужно? Потому что ваш using namespace std; приносит все в std на открытом воздухе без требований квалификатора пространства имен, включая потенциально std::function (включили или нет вы включили <functional>).

Это означает, хотя это будет компилироваться:

void function() 
{ 
    // .. stuff 
} 

Это не может:

int main() 
{ 
    function(); // HERE 
    //... other stuff 
} 

Это не знает, что вы звоните вашу функцию или попытка создать экземпляр одного временный тип std::function<> (что не может, так как параметры шаблона не описаны). Результатом может быть неоднозначный.

Вы можете исправить это с помощью ::function(); в вашем main(), но было бы лучше, если бы вы получили выработалась привычка не прихлебывая во всей std библиотеке через using namespace std;, и/или не использовать имена общих типов/ид от стандартная библиотека.

+1

И в самом деле, в первую очередь это должно быть использование либо итераторов, либо нумерации. – WhozCraig

+0

Вы правы. Я обновлю этот ответ –

+1

Май, а также исправьте разбитое предположение, что они 'getline' работали, пока вы на нем. Записанный цикл чтения только немного лучше, чем 'while (! Std :: cin.eof())', который [почти всегда неверен] (http://stackoverflow.com/questions/5605125/why- это-iostreameof-внутри-а-петля условие считается, неправильно). – WhozCraig

Смежные вопросы