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

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

Восстановить пароль Регистрация
 
Slayerz
2 / 2 / 1
Регистрация: 14.07.2012
Сообщений: 25
Завершенные тесты: 1
22.07.2012, 16:28     Чтение из файлов. Отсеивание символов #1
Добрый день. Необходимо реализовать программу, которая открывает файл и считывает числовые значения. К примеру, в файле написано: 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;
        }
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2012, 16:28     Чтение из файлов. Отсеивание символов
Посмотрите здесь:

Создание и чтение файлов в C++ C++
C++ Чтение символов с консоли
C++ Чтение файлов
C++ Чтение файлов
C++ Чтение русских символов из файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nexen
187 / 180 / 3
Регистрация: 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;
}
Не тестил, но вроде должно работать. Однако есть проблема - отрицательные числа. Я могу дописать и для отрицательных, но вам оно не нужно наверное, ведь данные типа "вес" и "рост" и не могут быть отрицательными
Slayerz
2 / 2 / 1
Регистрация: 14.07.2012
Сообщений: 25
Завершенные тесты: 1
22.07.2012, 16:51  [ТС]     Чтение из файлов. Отсеивание символов #3
1. Переназначил char c, на int c. Теперь программа, походу, выводит числа, которые закреплены в машинном коде за символами. Возможно стоит поместить данные из файла в string, а затем прогнать через услови, после чего поместить полученные числа в вектор? Но тут, скорее всего опять произойдет дробление?

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

2. Как лучше написать цикл, чтобы его размер менялся, в зависимости от количества данных? Можно к примеру в конце помещения всех данных в вектор, запросить его длину, и, тем самым, я получу длину цикла. Такой вариант допустим?
А меня не существуешь? >_<
Slayerz
2 / 2 / 1
Регистрация: 14.07.2012
Сообщений: 25
Завершенные тесты: 1
22.07.2012, 16:57  [ТС]     Чтение из файлов. Отсеивание символов #5
Ваш код не сразу проявился на форуме, а я уже нажал отправить, так что прошу прощения за это. Сейчас пробую с вашими коррективами переписать программу.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
22.07.2012, 17:15     Чтение из файлов. Отсеивание символов #6
Да, я там с типом накосячил. Пусть функция будет long long Read()
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
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); 
    }
}
при условии что имена свойств недопускают наличия цифр
Slayerz
2 / 2 / 1
Регистрация: 14.07.2012
Сообщений: 25
Завершенные тесты: 1
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;
nexen
187 / 180 / 3
Регистрация: 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]);
}
xADMIRALx
 Аватар для xADMIRALx
66 / 60 / 1
Регистрация: 09.06.2012
Сообщений: 291
22.07.2012, 17:38     Чтение из файлов. Отсеивание символов #10
хм,не прощи ли создать чаровский вектор и strcmp(tmp,"width") {}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2012, 17:51     Чтение из файлов. Отсеивание символов
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
22.07.2012, 17:51     Чтение из файлов. Отсеивание символов #11
Цитата Сообщение от xADMIRALx Посмотреть сообщение
хм,не прощи ли создать чаровский вектор и strcmp(tmp,"width") {}
Вы мне? Если да, то я не понял. Причем тут width и чаровский вектор?
Если не мне, то извините ; )
Yandex
Объявления
22.07.2012, 17:51     Чтение из файлов. Отсеивание символов
Ответ Создать тему
Опции темы

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