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

считывание данных из файла - C++

Восстановить пароль Регистрация
 
polindroma
0 / 0 / 0
Регистрация: 06.12.2011
Сообщений: 18
10.09.2012, 11:38     считывание данных из файла #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
#include <iostream.h>
#include <conio.h>
#include <malloc.h>
#include <string.h>
#include <fstream.h>
 
 
int menu_m()
{
 int a;
  cout<<"1. po ukazannomu articulu"<<endl;
  cout<<"2. po pervoy bukve artikula"<<endl;
  cout<<": ";
  cin>>a;
 return a;
}
 
void main()
{
 clrscr();
 
 struct ob
 {
  char artikul[5];
  char opisanie[15];
  int cena;
  int kolvo;
 };
 
 ob *a;
 int i,otvet;
 int n;
 
 const char
    *input="D:/infile.txt";
   // *output="D:/result.txt";
 
 cout<<"File dlya chteniya otkrit"<<endl;
 ifstream in(input);
 
 if (!in)
 {
  cerr<<"Oshibka otkritiya!";
 }
 else
 {
  in>>n;
  a=(ob *)calloc(n,sizeof(ob));
  for(i=1;i<=n;i++)
  {
    in>>a[i].artikul;
    in>>a[i].opisanie;
    in>>a[i].cena;
    in>>a[i].kolvo;
  }
 }
 cout<<"Dannye uspeshno schitany."<<endl;
получается эта билеберда
скриншот.
получается что в переменную артикула заносится и артикул и описание,а в описание мусор и описание.
исходный файл(текстовый)
7
D0011 sandali 500 16
D1273 sapogi 900 3
P7324 sapogi 750 2
D3428 tufli 700 12
M0012 sandali 600 10
M1128 botinki 800 4
P1121 botinki 750 3
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2012, 11:38     считывание данных из файла
Посмотрите здесь:

считывание данных из файла C++
Считывание данных из файла и их обработка C++
Считывание данных из файла C++
Считывание данных из файла C++
считывание данных из файла в C++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
10.09.2012, 14:37     считывание данных из файла #2
Откуда ты знаешь, что данные в структурах похерены ?
Как ты выводишь их на экран ?
polindroma
0 / 0 / 0
Регистрация: 06.12.2011
Сообщений: 18
10.09.2012, 15:00  [ТС]     считывание данных из файла #3
по F8 когда программу прогоняешь ту часть,где данные считываются,то получается,что в артикул сначала толкает артикул,потом дописывает описание сюда же и в само поле описание.А на экран вывожу
C++
1
2
3
4
for(i=1;i<=n;i++)
 {
  cout<<a[i].artikul<<" "<<cout<<a[i].opisanie<<" "<<a[i].cena<<" "<<a[i].kolvo<<endl;
 }
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
10.09.2012, 16:02     считывание данных из файла #4
Ну что ж, особенность первая.
При выполнении команды cout << a, где a - char[] или char*,
команда будет пытаться выводить символы до символа '\0'. Иными словами, сишные строки должны заканчиваться на нулевой символ.
У тебя же будет ровно 5 байтов данных, после которого cout увидит мусор (artikul[5], artikul[6] и т.д.) и посчитает его данными тоже.

Короче, проведи эксперимент:
Либо
а. выдели 6 байт под артикул не меняя входного файла и посмотри как меняется вывод (я запятые здесь не забыл?
либо
б. используй std::string вместо char[].

В случае a имей ввиду, что 6й символ будет нулевым, указывающим на конец строки.
polindroma
0 / 0 / 0
Регистрация: 06.12.2011
Сообщений: 18
10.09.2012, 21:00  [ТС]     считывание данных из файла #5
сделала так
C++
1
2
3
4
5
6
7
8
9
10
11
12
in>>n;
  in.ignore(1);
  a=(ob *)calloc(n,sizeof(ob));
  for(i=0;i<n;i++)
  {
    in.getline(a[i].artikul,6);
    in.ignore(1);
    in.getline(a[i].opisanie,15,' ');
    in>>a[i].cena;
    in>>a[i].kolvo;
    in.ignore(1);
  }
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
11.09.2012, 00:13     считывание данных из файла #6
работает ?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.09.2012, 05:14     считывание данных из файла #7
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
int main()
{
 system("cls");
 
 struct ob
 {
  char artikul[6];
  char opisanie[15];
  int cena;
  int kolvo;
 };
 
 ob *a;
 int i,otvet;
 int n = 1;
 
 
 //const char *input ="D:/result.txt";
 const char *input = "infile.txt";
   // *output="D:/result.txt";
 
 cout<<"File dlya chteniya otkrit"<<endl;
 
 ifstream in(input);
 
 if (!in)
 {
  cerr<<"Oshibka otkritiya!";
 }
 else
 {
  in >> n;
  a=(ob *)calloc(n, sizeof(ob));
  for(i = 0; i < n; i++)
  {
    in >> a[i].artikul;
    in >> a[i].opisanie;
    in >> a[i].cena;
    in >> a[i].kolvo;
    cout << a[i].artikul << " " <<a[i].opisanie << " " <<a[i].cena<< " " <<a[i].kolvo << endl;
  }
 }
cout<<"Dannye uspeshno schitany."<<endl;
free (a);
in.close();
 
 system("pause");
 return 0;
}
Цитата Сообщение от Andrew_Lvov Посмотреть сообщение
У тебя же будет ровно 5 байтов данных, после которого cout увидит мусор (artikul[5], artikul[6] и т.д.)
Там не мусор, а следующее поле структуры (opisanie). Поэтому cout << выводит artikul и продолжает вывод уже поля opisanie, пока не встретит там '\0', после этого выводит пробел, дальше - опять opisanie и далее. А вывод постороннего (некого адреса) у ТС происходит из-за этой строчки. Что здесь лишнее?
C++
1
cout<<a[i].artikul<<" "<<cout<<a[i].opisanie<<" "<<a[i].cena<<" "<<a[i].kolvo<<endl;
Добавлено через 4 минуты
Цитата Сообщение от polindroma Посмотреть сообщение
сделала так
C++
1
2
3
4
5
6
7
8
9
10
11
12
in>>n;
  in.ignore(1);
  a=(ob *)calloc(n,sizeof(ob));
  for(i=0;i<n;i++)
  {
    in.getline(a[i].artikul,6);
    in.ignore(1);
    in.getline(a[i].opisanie,15,' ');
    in>>a[i].cena;
    in>>a[i].kolvo;
    in.ignore(1);
  }
Если поля artikul и opisanie состоят из одного слова, то нет смысла усложнять код. in >> будет читать до пробела, т.е. слова.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2012, 05:35     считывание данных из файла
Еще ссылки по теме:

Считывание данных с файла C++
C++ Считывание данных из файла
C++ Считывание данных из файла

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.09.2012, 05:35     считывание данных из файла #8
Цитата Сообщение от polindroma Посмотреть сообщение
cout<<"File dlya chteniya otkrit"<<endl;
Ещё нет.

Добавлено через 5 минут
Цитата Сообщение от polindroma Посмотреть сообщение
D0011
А оартикул объявлен 4-х символьным. Каким образом ты надеешься запихать в него и 5 символов артикла, и ещё описание? В него и сам артикул не влезет.
Yandex
Объявления
11.09.2012, 05:35     считывание данных из файла
Ответ Создать тему
Опции темы

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