Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Punktir
0 / 0 / 0
Регистрация: 01.12.2009
Сообщений: 35
#1

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

23.10.2012, 22:38. Просмотров 490. Ответов 9
Метки нет (Все метки)

Всем доброго времени!
Проблема такая, есть выражение "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;
         }
Подскажите, пожалуйста, где я проглядел момент?
Меня напрягает, что условие цикла я взял с количества чисел-правильно ди это?
И стоит ли втыкать динам. массив?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2012, 22:38
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Неполное чтение из файла в массив (C++):

Чтение из файла в массив - C++
Всем привет! Извините, если такая тема уже поднималась, но я ничего не нашла.... У меня такая задачка. Есть два файлика, в одном матрица...

Чтение из файла в массив - C++
//--------------------------------------------------------------------------- #include &lt;clx.h&gt; #include &lt;stdio.h&gt; #pragma...

Чтение из файла в массив - C++
Есть файл, с которого надо считать данные. 12 56 14 10 8 6 35 48 Почему вылетает? #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

Чтение из файла в массив - C++
Здравствуйте, уважаемые программисты. Подскажите, пожалуйста. Есть текстовый файл примерно такого содержания: 15, 50, 30 155 ...

Чтение из файла в массив - C++
Задача №6 Постройте программу, которая отслеживает пожертвования в Общество Защиты Влиятельных Лиц. Она должна запрашивать у пользователя...

Чтение из файла с разделителями в массив - C++
Здравствуйте , возникла проблема с чтением из файла. После прочтения в массиве оказываются не те цифры если значение SIZE &gt; 10 , программа...

9
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2012, 22:59 #2
Дело в том, что читаете в int. calc >> ждёт цифру (или +, или -), а встречает *. После этого он уже ничего не читает.
1
Punktir
0 / 0 / 0
Регистрация: 01.12.2009
Сообщений: 35
23.10.2012, 23:04  [ТС] #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Дело в том, что читаете в int. calc >> ждёт цифру (или +, или -), а встречает *. После этого он уже ничего не читает.
Т.е. самый рациональный выход - вместо int юзать char?
0
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.10.2012, 23:09 #4
Цитата Сообщение от Punktir Посмотреть сообщение
Т.е. самый рациональный выход - вместо int юзать char?
Могу сказать только, что если, в данном примере, будете читать в char, то такой ошибки не будет.
0
Punktir
0 / 0 / 0
Регистрация: 01.12.2009
Сообщений: 35
23.10.2012, 23:10  [ТС] #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Могу сказать только, что если, в данном примере, будете читать в char, то такой ошибки не будет.
Значит остановлюсь пока что на этом,спасибо большое!
0
Байт
Эксперт C
17652 / 11690 / 1863
Регистрация: 24.12.2010
Сообщений: 23,302
23.10.2012, 23:14 #6
Punktir, Мой совет. Читай строку как символьную и сам ее разбирай. Сам понимай где знаки операций, где числа, где пробелы. Дело в том, что "cin>>" как и scanf - штуки очень себе на уме. ИМХО, легче самому раздраконить строку, чем вникать в их логику.
Хотя выбор, как всегда - за тобой.
0
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);
0
MrGrig
177 / 160 / 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й ячейки с умножением и делением довольно грамоздкий алгоритм может получиться в итоге именно по пересчету. Если считать сразу все в одну строку то сумму вычислять например так: считываете +, если после правого числа стоит *или/ то леворе число запомнить гденить и перейти к правому посмотреть что дальше, если нет записать сумму, двинуться дальше. это легко довольнотаки с помощью рекурсии сделать
1
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-ый по счёту элемент,то есть пятёрка теряется, с чем это может быть связано?
0
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.10.2012, 16:40 #10
Цитата Сообщение от Punktir Посмотреть сообщение
с чем это может быть связано?
С тем, что цифр пять, а массив на четыре элемента объявлен. И плюс последний теряется, по той же причине.
0
25.10.2012, 16:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2012, 16:40
Привет! Вот еще темы с ответами:

Чтение из файла в массив строк - C++
Всем добра! Пишу с таким вопросом: есть файл с текстом, длины строк не известны, надо задать динамический массив string (ну чтобы можно...

Чтение файла в массив строк - C++
Доброго времени суток!!! Как считать файл в массив строк? Заранее спасибо!!!

Чтение из файла в динамический массив - C++
Подскажите, читаю из файла количество элементов, затем элементы, но выводит нули.. Что не так? пример фала: 500 -0,103418643 ...

Чтение из файла и запись в массив на с++ - C++
Добрый день. Хотелось бы попросить помощи. Необходимо считать данные из файла(данные измерений в виде матрицы - числа типа double....


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

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