Форум программистов, компьютерный форум CyberForum.ru

Чтение из файла: getline() не работает - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.81
brkLTL
1 / 1 / 0
Регистрация: 18.07.2012
Сообщений: 8
22.08.2012, 00:02     Чтение из файла: getline() не работает #1
У меня такая ситуация: Есть два файла: words1.txt и cities-source.txt. Прилагаются.words1.txt
cities-source1.txt
Берем первую строку из words1 и начинаем сравнивать со строками в cities-source. Если во втором файле есть такая строка, то её печатаем.
Но я до этого не дошел, после того как i инкрементируется до 2, поиск в cities-source.txt не начинается с начала.
В чём моя ошибка?

Результат здесь
|asd_min=48
|word1=
|word1=123
|word1=
|word2=234
|word1=
|asd_sec=52
|word1=
|qwe_dir=005
|word1=
|qwe_deg=13
|word1=
|word3=345
|word1=
|word4=456
|word1=
|word5=567
|word1=
|qwe_min=6
|word1=
|qwe_sec=03
|word1=
|ddn=2345
|word1=
|calcalcal=234
|word1=
|asd_dir=665
|word1=
|asd_deg=50
|word1=
|asd_min=48
|word1=
|word1=123
|word1=
|word2=234
|word1=
|asd_sec=52
|word1=
|qwe_dir=005
|word1=
|qwe_deg=13
|word1=
|word3=345
|word1=
|word4=456
|word1=
|word5=567
|word1=
|qwe_min=6
|word1=
|qwe_sec=03
|word1=
|ddn=2345
|word1=
|calcalcal=234
|word1=
|calcalcal=234
|word2=
|calcalcal=234
|word2=
|calcalcal=234
|word2=
...
|calcalcal=234
|word5=
|calcalcal=234
|word5=

Process returned 0 (0x0) execution time : 0.797 s
Press any key to continue.


Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// search in exported xml file
 
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main()
{
   ifstream inputFile("E:\\A.TEMP\\cities-source1.txt"); // source xml file
   ifstream inputWord("E:\\A.TEMP\\words1.txt"); // source xml file
   ofstream outputFile("E:\\A.TEMP\\cities-result.txt"); // results output file
 
   string transfer; // temp string
   string word; // search keyword
 
   for(int i = 0; i < 5; i++)
   {
      getline(inputWord,word); // assign to "word" first word from file
      //cout << "getline(inputWord,word)" << word << endl; // visual control only
 
      for(int j = 0; j < 30; j++)
      {
         getline(inputFile,transfer); // assign to "transfer" first string from file
         //cout << "getline(inputFile,transfer)" << transfer << endl; // visual control only
 
         //if(transfer.find(word) != string::npos) // if transfer string contains word's word print transfer string
         cout << transfer << endl; // if ok, replace cout by outputFile
         cout << word << endl; // delete if ok
      }
   }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2012, 00:02     Чтение из файла: getline() не работает
Посмотрите здесь:

чтение с текстового файла getline()' ом C++
string, getline() чтение строк C++
Чтение из файла, не используя getline C++
не работает getline C++
Чтение текстовых файлов для новичков (getline) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.08.2012, 01:36     Чтение из файла: getline() не работает #2
Детали сами додумаете:
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main()
{
   ifstream inputFile("cities-source1.txt"); 
   if(!inputFile.is_open()) cout << "Error opening  file cities-source1.txt!" << endl;
   ifstream inputWord("words1.txt"); 
   if(!inputWord.is_open()) cout << "Error opening  file words1.txt!" << endl;
   ofstream outputFile("cities-result.txt"); 
   if(!outputFile.is_open()) cout << "Error opening  file cities-result.txt!" << endl;
 
   string transfer;
   string word;
 
   for(int i = 0; i < 5; i++)
   {
      getline(inputWord,word);
      for(int j = 0; j < 30; j++)
      {
         
         getline(inputFile,transfer); 
         
         if(!(transfer.compare(0, word.size(), word)))
         { 
            cout << transfer << endl; 
            cout << word << endl;
            outputFile << transfer << endl;
            outputFile << word << endl;
            inputFile.clear();
         } 
       }
       
       inputFile.clear();
       inputFile.seekg(0);
    }
 
    cin.get();
    return 0;
 
}
edward_jonson
 Аватар для edward_jonson
157 / 157 / 25
Регистрация: 23.02.2011
Сообщений: 388
22.08.2012, 01:37     Чтение из файла: getline() не работает #3
добавьте в конец второго цикла (тот, что for(int j = 0; j < 30; j++))
C++
1
2
3
4
if ( inputFile.eof() ) {
             inputFile.clear();
             inputFile.seekg (0, ios::beg);
         }
brkLTL
1 / 1 / 0
Регистрация: 18.07.2012
Сообщений: 8
22.08.2012, 14:36  [ТС]     Чтение из файла: getline() не работает #4
Цитата Сообщение от alsav22 Посмотреть сообщение
Детали сами додумаете:
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main()
{
   ifstream inputFile("cities-source1.txt"); 
   if(!inputFile.is_open()) cout << "Error opening  file cities-source1.txt!" << endl;
   ifstream inputWord("words1.txt"); 
   if(!inputWord.is_open()) cout << "Error opening  file words1.txt!" << endl;
   ofstream outputFile("cities-result.txt"); 
   if(!outputFile.is_open()) cout << "Error opening  file cities-result.txt!" << endl;
 
   string transfer;
   string word;
 
   for(int i = 0; i < 5; i++)
   {
      getline(inputWord,word);
      for(int j = 0; j < 30; j++)
      {
         
         getline(inputFile,transfer); 
         
         if(!(transfer.compare(0, word.size(), word)))
         { 
            cout << transfer << endl; 
            cout << word << endl;
            outputFile << transfer << endl;
            outputFile << word << endl;
            inputFile.clear();
         } 
       }
       
       inputFile.clear();
       inputFile.seekg(0);
    }
 
    cin.get();
    return 0;
 
}
Всё, кажется понял.
А на 39 строке не inputWord.clear() должен быть, а не inputFile.clear()?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.08.2012, 23:26     Чтение из файла: getline() не работает #5
Цитата Сообщение от brkLTL Посмотреть сообщение
А на 39 строке не inputWord.clear() должен быть, а не inputFile.clear()?
Во внутреннем цикле чтение идёт из inputFile до конца файла. При достижении конца файла устанавливетя флаг eofbit. Для того, чтобы снова читать из этого файла (при следующеё итерации внешнего for), нужно этот флаг сбросить и вернуть курсор в начало файла. Для inputWord флаг eofbit устанавливается при выходе из внешнего for. Так как дальше к этому потоку обращение не происходит, то и в сбрасывании флага нужды нет. Для порядка, после 41 строки, нужно дописать:
C++
1
2
3
inputFile.close();
inputWord.close();
outputFile.close();
В 35 строке: inputFile.clear(); не нужен, это я лишнее написал.
Yandex
Объявления
22.08.2012, 23:26     Чтение из файла: getline() не работает
Ответ Создать тему
Опции темы

Текущее время: 05:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru