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

Странности при вводе из файла - C++

Восстановить пароль Регистрация
 
_kod_
4 / 4 / 0
Регистрация: 24.10.2011
Сообщений: 84
08.04.2012, 18:45     Странности при вводе из файла #1
Программа должна получать данные из файла.... Примечательно, что она их получает корректно только при определенном положении слов в файлике. Подскажите, что я делаю не так.
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
//---------------------------------------------------------------------------
#include <iostream>
#include <fstream>
#include <stdlib>
#include <vcl.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
struct patrons
 {
  char name[20];
  double sum;
 };
 
int main(int argc, char* argv[])
{
 ifstream inFile;
 inFile.open("patrons.txt");
 
  if(!inFile.good())
  {
   cout<<"File not open!"<<endl;
   exit(EXIT_FAILURE);
  }
  int i, c = 0;
  int k = 0, k2 = 0;
 //cout<<"Enter the number of patrons: ";
 inFile >> i;
 
 cout<<"i = "<<i<<endl;
 patrons *ps = new patrons[i];
 //cin.get();
 while (inFile.good())
  {
 
   //cout<<"Enter the name of "<<j+1<<" patron: "<<endl;
   inFile.getline (ps[c].name,20);
 
   //cout<<ps[c].name<<endl;
   //cout<<"Enter the sum of patrons: ";
   inFile >> ps[c].sum;
   //cout<<ps[c].sum<<endl;
   c++;
   //cin.get();
  }
 
  if (inFile.eof())
   cout<<"End of file."<<endl;
 
   else
    if(inFile.fail() )
     cout<<"Uknown data."<<endl;
 
 
 
  cout<<"***Grand Patrons***"<<endl;
  for (int j = 0;j<i;j++)
  {
    if (ps[j].sum >= 10000)
     {
      cout<<ps[j].name<<"\t"<<ps[j].sum<<endl;
      k++;
     }
  }
 
 if (k == 0)
    cout<<"(none)"<<endl;
 
  cout<<"***Patrons***"<<endl;
 for (int j =0;j<i;j++)
  {
   if(ps[j].sum < 10000)
    {
     cout << ps[j].name <<"\t"<<ps[j].sum<<endl;
     k2++;
    }
  }
 
 if (k2 == 0)
  cout<<"(none)"<<endl;
 
 inFile.close();
 system("pause");
 
        return 0;
}
//---------------------------------------------------------------------------
Сори за такой код) Может быть кому-то покажется карявым... А вот и файлик, который надо считать в прогу:
4 Yaha Druganov
12000.0 Ivan Pupkin
11500.0 Yan Dias
32000.0 Alex C
3500.0

Вот так он его читает без проблем...
А вот так вообще не хочет:
4
Yaha Druganov
12000.0
Ivan Pupkin
11500.0
Yan Dias
32000.0
Alex C
3500.0

Прога пишет, что данные не совпадают Что делать-то?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2012, 18:45     Странности при вводе из файла
Посмотрите здесь:

C++ Ошибка при вводе
Странности с чтением объекта структуры из файла C++
C++ при вводе из файла проверить следующая строка пустая или нет
win32api странности при выводе на экран C++
C++ Составить программу, которая при вводе символа с клавиатуры выво-дит "латинская буква" при вводе латинской буквы и "не латинская бук-ва" во всех остал
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
User1990
26 / 26 / 2
Регистрация: 03.11.2009
Сообщений: 158
08.04.2012, 19:25     Странности при вводе из файла #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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <fstream>
#include <stdlib>
 
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
struct patrons
 {
  char name[20];
  double sum;
 };
 
int main(int argc, char* argv[])
{
 ifstream inFile;
 inFile.open("patrons.txt");
 
  if(!inFile.good())
  {
   cout<<"File not open!"<<endl;
   exit(EXIT_FAILURE);
  }
  int i, c = 0;
 
 inFile >> i;
 
 cout<<"i = "<<i<<endl;
 patrons *ps = new patrons[i];
 
 while (!inFile.eof())
  {
   inFile>>ps[c].name;
   inFile >> ps[c].sum;
   c++;
  }
 
  cout<<"***Grand Patrons***"<<endl;
  for (int j = 0;j<i;j++)
  {
    if (ps[j].sum >= 10000)
     {
      cout<<ps[j].name<<"\t"<<ps[j].sum<<endl;
      k++;
     }
  }
 
 if (k == 0)
    cout<<"(none)"<<endl;
 
  cout<<"***Patrons***"<<endl;
 for (int j =0;j<i;j++)
  {
   if(ps[j].sum < 10000)
    {
     cout << ps[j].name <<"\t"<<ps[j].sum<<endl;
     k2++;
    }
  }
 
 if (k2 == 0)
  cout<<"(none)"<<endl;
 
 inFile.close();
delete [] ps;
 system("pause");
 
        return 0;
}
//---------------------------------------------------------------------------
а вот так...
_kod_
4 / 4 / 0
Регистрация: 24.10.2011
Сообщений: 84
08.04.2012, 19:33  [ТС]     Странности при вводе из файла #3
User1990, нет... Для чтения строки необходимо применять метод getline(), а не >>

C++
1
inFile.getline (ps[c].name,20);
_kod_
4 / 4 / 0
Регистрация: 24.10.2011
Сообщений: 84
08.04.2012, 19:38  [ТС]     Странности при вводе из файла #4
Вот результат выполнения при расположении строк в порядке:

4 Yaha Druganov
12000.0 Ivan Pupkin
11500.0 Yan Dias
32000.0 Alex C
3500.0

Странности при вводе из файла

То есть все читается нормально и каретка чтения(надеюсь правильно выразился ) доходит до байта EOF.... А вот при другом расположении все накрывается медным тазиком
User1990
26 / 26 / 2
Регистрация: 03.11.2009
Сообщений: 158
08.04.2012, 21:17     Странности при вводе из файла #5
Цитата Сообщение от _kod_ Посмотреть сообщение
User1990, нет... Для чтения строки необходимо применять метод getline(), а не >>
Код C++
1
inFile.getline (ps[c].name,20);
для задача принципиально? или ты хочешь поспорить о том, что оператором >> нельзя читать массив символов? Дело в том, что связанный объект of ifstream c файловым буфером при помощи >> читает данные до первого символа-разделителя (пробел , конец строки и т.д.) Т,О.
получаем , что если данные записаны в файле как
4
IvanMalicov 15154.10
OlegPopov 2424.21
, то ifstream ifs;
ifs>>name;//запишется туда IvanMalicov
ifs>>kod;//запишется туда 15154.10
, а я понял тебя , тогда используй getline с таким прототипом basic_istream& getline (char_type* s, streamsize n, char_type delim );, где delim символ разделитель, т.е. между name и kod надо использовать дополнительный символ разделитель
_kod_
4 / 4 / 0
Регистрация: 24.10.2011
Сообщений: 84
08.04.2012, 21:30  [ТС]     Странности при вводе из файла #6
С помощью >> можно читать, я ничего не говорю... Но

Цитата Сообщение от User1990 Посмотреть сообщение
до первого символа-разделителя (пробел , конец строки и т.д.)
А у меня там имя и фамилия, поэтому я использовал getline.... Проблема в том, что этот метод каряво обрабатывает нужное мне расположение строк
User1990
26 / 26 / 2
Регистрация: 03.11.2009
Сообщений: 158
08.04.2012, 21:31     Странности при вводе из файла #7
basic_istream& getline (char_type* s, streamsize n, char_type delim ); а эту функци. использовать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2012, 21:41     Странности при вводе из файла
Еще ссылки по теме:

зацикливание при вводе из файла C++
Кирилица отображается нормально при выводе из программы, но иероглифы при вводе в консоль C++
C++ Как распознать кодировку текста при вводе из файла?

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

Или воспользуйтесь поиском по форуму:
_kod_
4 / 4 / 0
Регистрация: 24.10.2011
Сообщений: 84
08.04.2012, 21:41  [ТС]     Странности при вводе из файла #8
Не совсем понимаю, как именно ее использовать
Цитата Сообщение от User1990 Посмотреть сообщение
basic_istream& getline (char_type* s, streamsize n, char_type delim );
Yandex
Объявления
08.04.2012, 21:41     Странности при вводе из файла
Ответ Создать тему
Опции темы

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