Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
2 / 2 / 1
Регистрация: 14.07.2012
Сообщений: 28
1

Чтение из файлов. Отсеивание символов

22.07.2012, 16:28. Просмотров 945. Ответов 10
Метки нет (Все метки)

Добрый день. Необходимо реализовать программу, которая открывает файл и считывает числовые значения. К примеру, в файле написано: Mass = 70, Weight = 40. Необходимо, чтобы программа отсеяла все символы и поместила в массив 70 и 40. Вот я попробовал написать программку, она запускается, но когда доходит до шага вывода информации на экран возникает ошибка: "vector subscript out of range". Что именно нужно подправить? И программа дробит числа на отдельные цифры: 70 становятся 7 и 0, 40 - 4 и 0.

И еще такой вопрос: как объяснить циклу, чтобы он выводил данные до тех пор, пока они не кончатся в файле? К примеру, в файле будет записано 100 параметров, а цикл, в моем примере, рассчитан только на 10 ячеек массива. Написать цикл на 100 не предлагать , ибо файл будет с динамическими данными.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
vector<int> A;
    char c;
    void print()
    {
        ifstream a("dannie.txt");
        while(!a.eof())
        {
            a >> c;
            if(isdigit(c))
            {
                A.push_back(c); 
            }
        }
        for(int i = 0; i < 10; i++)
        {
            cout << A[i] << endl;
        }
    }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.07.2012, 16:28
Ответы с готовыми решениями:

Чтение русских символов. Отрицательные значения у символов
Добрый вечер. Считую файл .txt. Но русские буквы получают отрицательное значение. И в итоге при...

В каком из файлов и где сменить права на чтение файлов (пользователи и группы) Apache2?
/etc/apache2/ |-- apache2.conf | `-- ports.conf |-- mods-enabled | |-- *.load | ...

Удаление из имён файлов определённых символов и сочетаний символов
Есть много обложек и в названиях присутствуют знаки &quot;%2C+&quot; и &quot;+&quot; (без кавычек) пример:...

Чтение файлов, запись и дозапись в файл, поиск файлов в каталоге и поиск данных в файле
2. Создать файлы, в которых будут вмещаться строки с именами студентов и их средними балами. Каждый...

10
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
22.07.2012, 16:44 2
Твои ошибки :
1) Ты считываешь char и засовываешь в вектор. Отсюда дробление, ибо считываешь ты символ, а не число.
2) Ты ВСЕГДА идешь до 9 элемента вектора, отсюда и "vector subscript out of range"

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <conio.h>
...
int Read()
{
char c = getchar();
long long num = 0;
while (c != EOF && !isdigit(c))
if (c == EOF)
return -1;
num += (c-'0');
c = getchar();
while (isdigit(c) && c != EOF)
{
num = num*10 + (c-'0');
c = getchar();
}
return num;
}
Не тестил, но вроде должно работать. Однако есть проблема - отрицательные числа. Я могу дописать и для отрицательных, но вам оно не нужно наверное, ведь данные типа "вес" и "рост" и не могут быть отрицательными
0
2 / 2 / 1
Регистрация: 14.07.2012
Сообщений: 28
22.07.2012, 16:51  [ТС] 3
1. Переназначил char c, на int c. Теперь программа, походу, выводит числа, которые закреплены в машинном коде за символами. Возможно стоит поместить данные из файла в string, а затем прогнать через услови, после чего поместить полученные числа в вектор? Но тут, скорее всего опять произойдет дробление?

2. Как лучше написать цикл, чтобы его размер менялся, в зависимости от количества данных? Можно к примеру в конце помещения всех данных в вектор, запросить его длину, и, тем самым, я получу длину цикла. Такой вариант допустим?
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
22.07.2012, 16:54 4
Цитата Сообщение от Slayerz Посмотреть сообщение
1. Переназначил char c, на int c. Теперь программа, походу, выводит числа, которые закреплены в машинном коде за символами. Возможно стоит поместить данные из файла в string, а затем прогнать через услови, после чего поместить полученные числа в вектор? Но тут, скорее всего опять произойдет дробление?

2. Как лучше написать цикл, чтобы его размер менялся, в зависимости от количества данных? Можно к примеру в конце помещения всех данных в вектор, запросить его длину, и, тем самым, я получу длину цикла. Такой вариант допустим?
А меня не существуешь? >_<
0
2 / 2 / 1
Регистрация: 14.07.2012
Сообщений: 28
22.07.2012, 16:57  [ТС] 5
Ваш код не сразу проявился на форуме, а я уже нажал отправить, так что прошу прощения за это. Сейчас пробую с вашими коррективами переписать программу.
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
22.07.2012, 17:15 6
Да, я там с типом накосячил. Пусть функция будет long long Read()
0
Каратель
Эксперт С++
6593 / 4014 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
22.07.2012, 17:19 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
vector<int> data;
char c = 0;
int num = 0;
std::ifstream file("data.txt");
while(file >> c)
{
    if(std::isdigit(c))
    {
         file.putback(c);
         file >> num;
         data.push_back(num); 
    }
}
при условии что имена свойств недопускают наличия цифр
0
2 / 2 / 1
Регистрация: 14.07.2012
Сообщений: 28
22.07.2012, 17:25  [ТС] 8
Вот, попробовал прикрутить ваш код. Программа компилирует, но выдает пустой кран, возможно я неправильно понял некоторые части кода или неправильно прикрутил.
Num, в нашем случае, работает в качестве счетчика?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    long long num = 0;
    ifstream c("dannie.txt");
    int Read();
    {       
            char c = getchar();
            a >> c;
            while (c != EOF && !isdigit(c)) // Если не число и не конец файла, то пропуск.
            if (c == EOF)
            return -1;
            num += (c-'0'); // Не совсем понял как это работает
            c = getchar(); //Если нет, то поместить в С
            while (isdigit(c) && c != EOF) // Если число и не конец файла, то поместить в С
            {
                num = num*10 + (c-'0');
                c = getchar();
                cout << c << endl;
            }
    }
        return num;
 
    system("pause");
    return 0;
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
22.07.2012, 17:30 9
Slayerz,
Нет. В моем случае вся конструкция - это функция считывания. Она пропускается все символы перед собой до тех пор, пока не увидит число. Считывает число и возвращает его.
Т.е, главная функция была бы такой :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void main()
{
vector <long long> mas;
long long tmp;
tmp = Read();
while (tmp != -1)
{
mas.push_back(tmp);
tmp = Read();
}
for (int i=0; i<mas.size(); ++i)
printf("%I64d ", mas[i]);
}
0
69 / 63 / 5
Регистрация: 09.06.2012
Сообщений: 291
22.07.2012, 17:38 10
хм,не прощи ли создать чаровский вектор и strcmp(tmp,"width") {}
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
22.07.2012, 17:51 11
Цитата Сообщение от xADMIRALx Посмотреть сообщение
хм,не прощи ли создать чаровский вектор и strcmp(tmp,"width") {}
Вы мне? Если да, то я не понял. Причем тут width и чаровский вектор?
Если не мне, то извините ; )
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.07.2012, 17:51

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Хранение файлов в БД и чтение файлов
Привет. Наткнулся на такой оператор &quot;LOAD DATA INFILE '1.txt' INTO TABLE `my`&quot; Он должен считать...

Отсеивание массивов
Уже второй день я мучаюсь с программой, почти доделал. Осталось только сделать отсеивание массивов....

Отсеивание по группам
Добрый день, у меня или сложная задача или я туплю. Есть такая таблица. 1 A1 Y 1 A2 Y 1 ...

Отсеивание по дате.
Подскажите пожалуйста что можно сделать. Имеется таблица с двумя полями (Фамилия, дата рождения) ...


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

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

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