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

Неполное чтение из файла в массив - C++

Восстановить пароль Регистрация
 
Punktir
0 / 0 / 0
Регистрация: 01.12.2009
Сообщений: 35
23.10.2012, 22:38     Неполное чтение из файла в массив #1
Всем доброго времени!
Проблема такая, есть выражение "1+8*3/4+5", которое хранится в файле, читаю вначале цифры и толкаю их в массив, затем знаки и в другой массив. на этапе считывания чисел заметил момент, что ВСЕ, цифры после знака * зануляются, т.е. мне на cout только 1 8 0 0 0. Вот фрагмент листинга.
C++ (Qt)
1
2
3
4
5
6
7
8
9
 fstream calc;
 
    int ch[5];
    calc.open ("calc.in",ios::in);
    for (int i=0;i<5;i++)
        {
        calc  >>ch[i];
        cout<<ch[i]<<endl;
         }
Подскажите, пожалуйста, где я проглядел момент?
Меня напрягает, что условие цикла я взял с количества чисел-правильно ди это?
И стоит ли втыкать динам. массив?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2012, 22:38     Неполное чтение из файла в массив
Посмотрите здесь:

Чтение из файла в массив C++
Чтение из файла и запись в массив на с++ C++
Чтение из файла в массив до разделителя C++
C++ Чтение в двумерный массив из файла
C++ Чтение из файла в массив
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2012, 22:59     Неполное чтение из файла в массив #2
Дело в том, что читаете в int. calc >> ждёт цифру (или +, или -), а встречает *. После этого он уже ничего не читает.
Punktir
0 / 0 / 0
Регистрация: 01.12.2009
Сообщений: 35
23.10.2012, 23:04  [ТС]     Неполное чтение из файла в массив #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Дело в том, что читаете в int. calc >> ждёт цифру (или +, или -), а встречает *. После этого он уже ничего не читает.
Т.е. самый рациональный выход - вместо int юзать char?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2012, 23:09     Неполное чтение из файла в массив #4
Цитата Сообщение от Punktir Посмотреть сообщение
Т.е. самый рациональный выход - вместо int юзать char?
Могу сказать только, что если, в данном примере, будете читать в char, то такой ошибки не будет.
Punktir
0 / 0 / 0
Регистрация: 01.12.2009
Сообщений: 35
23.10.2012, 23:10  [ТС]     Неполное чтение из файла в массив #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Могу сказать только, что если, в данном примере, будете читать в char, то такой ошибки не будет.
Значит остановлюсь пока что на этом,спасибо большое!
Байт
 Аватар для Байт
13974 / 8805 / 1227
Регистрация: 24.12.2010
Сообщений: 15,950
23.10.2012, 23:14     Неполное чтение из файла в массив #6
Punktir, Мой совет. Читай строку как символьную и сам ее разбирай. Сам понимай где знаки операций, где числа, где пробелы. Дело в том, что "cin>>" как и scanf - штуки очень себе на уме. ИМХО, легче самому раздраконить строку, чем вникать в их логику.
Хотя выбор, как всегда - за тобой.
Punktir
0 / 0 / 0
Регистрация: 01.12.2009
Сообщений: 35
23.10.2012, 23:24  [ТС]     Неполное чтение из файла в массив #7
Цитата Сообщение от Байт Посмотреть сообщение
Punktir, Мой совет. Читай строку как символьную и сам ее разбирай. Сам понимай где знаки операций, где числа, где пробелы. Дело в том, что "cin>>" как и scanf - штуки очень себе на уме. ИМХО, легче самому раздраконить строку, чем вникать в их логику.
Хотя выбор, как всегда - за тобой.
Суть проги как раз в присвоении приоритета операции / и *, в ручном переопределении новых значений ячеек массива после того как выполнится какое-либо из этих двух действий. И проблема как раз в том, что в попытке выдернуть вначале числа в 1 массив, а во 2 массив эти знаки ни к чему не привели,а когда char, то тупо мне все выражение запихивает в массив, откуда потом сложно выдергивать по-знаково в одно, численно в другое.

Суть вся вот в чем(без последующей записи в другой файл):

C++ (Qt)
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
 fstream calc;
    double z=0;
    char mas[5];
    char ch[10];
    int x;
    calc.open ("calc.in",ios::in);
    for (int i=0;i<9;i++)
        {
        calc  >>ch[i];
 
        }
 
        do {
          for (int i=0; i<9; i++)
           {
              if(mas[i]=='*')
                {
                ch[0]=1;
                ch[1]*=ch[2];
                ch[2]=ch[3];
                ch[3]=ch[4];
                ch[4]=0;
 
                    }cout<<ch[1];
                  if (mas[i]=='/')
                        {
                    ch[0]=1;
                    ch[1]=ch[1]*ch[2]/ch[3];
                    ch[2]=ch[3];
                    ch[3]=0;
                        }
                            if (mas[i]=='+')
                                ch[0]+=ch[1]+ch[2];
 
                                }
                                     }
                      while (calc>>x);
MrGrig
176 / 159 / 2
Регистрация: 08.10.2012
Сообщений: 422
23.10.2012, 23:47     Неполное чтение из файла в массив #8
Цитата Сообщение от Punktir Посмотреть сообщение
if(mas[i]=='*')
* * * * * * * * {
* * * * * * * * ch[0]=1;
* * * * * * * * ch[1]*=ch[2];
* * * * * * * * ch[2]=ch[3];
* * * * * * * * ch[3]=ch[4];
* * * * * * * * ch[4]=0;
}cout<<ch[1];
* * * * * * * * * if (mas[i]=='/')
* * * * * * * * * * * * {
* * * * * * * * * * ch[0]=1;
* * * * * * * * * * ch[1]=ch[1]*ch[2]/ch[3];
* * * * * * * * * * ch[2]=ch[3];
* * * * * * * * * * ch[3]=0;
* * * * * * * * * * * * }
* * * * * * * * * * * * * * if (mas[i]=='+')
* * * * * * * * * * * * * * * * ch[0]+=ch[1]+ch[2];
что это?
Цитата Сообщение от Punktir Посмотреть сообщение
char, то тупо мне все выражение запихивает в массив, откуда потом сложно выдергивать по-знаково в одно, численно в другое.
создайте 2 чаровских массива. в 1й записываете цифры, во 2й записывайте символы, причем сделайте массив 2ный с 3мя ячейками. в 1ю записываете символ в остальные 2 между какими позициями стоит символ действия. условие достаточно простое
C++
1
2
3
4
if(ch[i]>'0'&&ch[i]<'9')
     //пишем в числовой массив (можно с автоматическим переводом даже)
if(!(ch[i]>'0'&&ch[i]<'9'))
    //пишем в строковый запоминая i-1 и i+1
Добавлено через 10 минут
опять же потом строковый массив можно отсортировать, чтобы был так сказать приоритет у умножения и деления. Далее нужно сделать что-то если у вас есть совподения по 2й или 3й ячейки с умножением и делением довольно грамоздкий алгоритм может получиться в итоге именно по пересчету. Если считать сразу все в одну строку то сумму вычислять например так: считываете +, если после правого числа стоит *или/ то леворе число запомнить гденить и перейти к правому посмотреть что дальше, если нет записать сумму, двинуться дальше. это легко довольнотаки с помощью рекурсии сделать
Punktir
0 / 0 / 0
Регистрация: 01.12.2009
Сообщений: 35
25.10.2012, 13:25  [ТС]     Неполное чтение из файла в массив #9
Решил использовать такой момент:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
    int i=0;
    char zn[3];
    int ch[4];
    calc.open ("calc.in",ios::in);
        calc >>ch[0];
          do
             {
              calc>> zn[i];
              i++;
             }
             while (calc >>ch[i]);
Но столкнулся с тем, что элементы с индексами 0,1,2,3, т.е. числа выражения 1+8*3/4+5 считываются в массив на ура,а 4-ый по счёту элемент,то есть пятёрка теряется, с чем это может быть связано?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2012, 16:40     Неполное чтение из файла в массив
Еще ссылки по теме:

C++ Чтение из файла в массив
C++ Чтение из файла в массив
Чтение из файла в массив C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.10.2012, 16:40     Неполное чтение из файла в массив #10
Цитата Сообщение от Punktir Посмотреть сообщение
с чем это может быть связано?
С тем, что цифр пять, а массив на четыре элемента объявлен. И плюс последний теряется, по той же причине.
Yandex
Объявления
25.10.2012, 16:40     Неполное чтение из файла в массив
Ответ Создать тему
Опции темы

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