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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.81
brkLTL
1 / 1 / 0
Регистрация: 18.07.2012
Сообщений: 8
#1

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

22.08.2012, 00:02. Просмотров 2743. Ответов 4
Метки нет (Все метки)

У меня такая ситуация: Есть два файла: 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() не работает
Посмотрите здесь:
C++ Getline чтение из файла
чтение с текстового файла getline()' ом C++
Чтение из файла, не используя getline C++
C++ Как начать чтение файла сначала после Getline с первой строчки в fstream?
string, getline() чтение строк C++
Чтение текстовых файлов для новичков (getline) C++
Чтение/запись битового файла (не работает) C++
C++ Чтение из файла в CodeBlocks работает, а в QtCreator - нет
C++ Чтение из файла - программа корректно работает лишь раз
не работает getline C++
C++ Не работает getline()
C++ Не работает getline!

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 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
158 / 158 / 25
Регистрация: 23.02.2011
Сообщений: 390
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
5416 / 4812 / 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() не работает
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru