2015-02-01 3 views
1

Цель:

Я читаю текстовый файл слово за словом и сохраняю каждое слово как элемент в массиве. Затем я печатаю этот массив, слово за словом. Я знаю, что это можно сделать более эффективно, но это для назначения, и я должен использовать массив.Как я могу игнорировать символ «конец строки» или «новая строка» при чтении текстовых файлов слово за словом?

Я делаю больше с массивом, например, подсчитывая повторяющиеся элементы, удаляя определенные элементы и т. Д. Я также успешно преобразовал файлы в полностью строчные и без пунктуации.

Текущая ситуация:

У меня есть текстовый файл, который выглядит следующим образом:

beginning of file 




more lines with some bizzare  spacing 
some lines next to each other 
while 

others are farther apart 
eof 

Вот некоторые из моего кода с itemsInArray инициализируется в 0 и массив слов обозначаться как wordArray[ (approriate length for my file) ]


ifstream infile; 
infile.open(fileExample); 

while (!infile.eof()) { 

    string temp; 
    getline(infile,temp,' '); // Successfully reads words seperated by a single space 


    if ((temp != "") && (temp != '\n') && (temp != " ") && (temp != "\n") && (temp != "\0") { 
      wordArray[itemsInArray] = temp; 
      itemsInArray++; 
    } 

Проблема:

Мой код сохранения символ конца строки в качестве элемента в моем массиве. В моей инструкции if я перечислил все способы, с помощью которых я пытался отличить символ конца строки, но мне не повезло.

Как предотвратить сохранение символа конца строки в качестве элемента в массиве?

Я пробовал несколько других методов, которые я нашел на темы похожие на это, включая что-то с *const char, что я не мог сделать работу, а также итерации и удаления новых символов строки. Я работаю над этим часами, я не хочу повторять ту же проблему и пробовал много разных методов.

+0

В моем .txt-файле содержится целая книга без прописных букв на данный момент. Существует несколько «возвратов» или новых строк для разделения глав. Я уже обошел сохранение лишних пробелов в качестве элементов в моем массиве, я только боюсь ** не ** сохранять новые строковые символы. Еще раз спасибо. – wrightMatthew

+0

* Родственные *: http://stackoverflow.com/q/5605125/78845 – Johnsyweb

ответ

0

оператор извлечения потока должен позаботиться о том, что для вас

std::ifstream ifs("file.txt"); 
while (ifs.good()) 
{ 
    std::string word; 
    ifs >> word; 
    if (ifs.eof()) 
    { 
     break; 
    } 

    std::cout << word << "\n"; 
} 
+0

Большое спасибо. Это помогло. Я новичок в кодировании и не знаю о функции прерывания. Проблема, которую я получал, заключается в том, что иногда возврат (новая строка) или несколько возвратов читаются в виде собственной строки. – wrightMatthew

2

Стандартной >> перегружены для std::string уже использует бело-пространство как границы слова так что ваша программа может быть упрощена много.

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

int 
main() 
{ 
    std::vector<std::string> words {}; 
    { 
    std::string tmp {}; 
    while (std::cin >> tmp) 
     words.push_back(tmp); 
    } 
    for (const auto& word : words) 
    std::cout << "'" << word << "'" << std::endl; 
} 

Для входа вы показываете, это будет выход:

'beginning' 
'of' 
'file' 
'more' 
'lines' 
'with' 
'some' 
'bizzare' 
'spacing' 
'some' 
'lines' 
'next' 
'to' 
'each' 
'other' 
'while' 
'others' 
'are' 
'farther' 
'apart' 
'eof' 

Разве это не то, что вы хотите?

0
int main() 
{ 
    char *n; 
    int count=0,count1=0; 
    ofstream output("user.txt"); 
    output<<"aa bb cc"; 
    output.close(); 
    ifstream input("user.txt"); 
    while(!input.eof()) 
    { 
     count++; 
     if(count1<count) 
     cout<<" "; 
     count1=count; 

     input>>n; 
     cout<<n; 
    } 
    cout<<"\ncount="<<count; 
    getch(); 
} 
+0

Это только для избежания интервала. –