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

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

Войти
Регистрация
Восстановить пароль
 
Slayerz
2 / 2 / 1
Регистрация: 14.07.2012
Сообщений: 28
Завершенные тесты: 2
#1

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

22.07.2012, 16:28. Просмотров 795. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2012, 16:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение из файлов. Отсеивание символов (C++):

Чтение символов из файла - C++
Дан текст; определить, содержит ли он символы, отличные от букв и пробела

Чтение символов из строки - C++
Мне нужно из строковой переменной считать символы. То есть, например, имеем строку 56-&gt;57. Нужно считать символы до ' - ', в другую...

Чтение символов с консоли - C++
Как записать в строку уже выведенные на консоль символы, в том числе пробелы? scanf ждет, что я их введу с клавиатуры Среда - Борланд...

Чтение файлов - C++
Имеется файл c большим размером, открытым в булевом режиме чтения. Нужно считать часть этого файла размером 65535 байт, потом снова считать...

Чтение файлов - C++
Здравствуйте! Подскажите пожалуйста как прочитать из файла таблицу чисел которая записанна с точностью до 12 знака после запятой. мне...

Чтение файлов - C++
Доброго времени суток! Хочу спросить у знающих людей такой вопрос! По поводу чтения файлов. У меня есть несколько таких файлов:...

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

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

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

Чтение из файла unicode-символов - C++
Добрый день. помогите пожалуйста с таким вопросом. Имеется файл, сохранённый с кодировкой unicode. в нём записаны символы ζϢ. ...

Чтение русских символов из файла - C++
Помогите пожалуйста с решением проблемы. Программа должна считывать символы из файла написанного заглавными русскими буквами и считать...

Чтение бинарных файлов - C++
Здравствуйте уважаемые эксперты,хотелось бы узнать как можно прочитать шестнадцатиричные значения из файла,длиной 1б,в блок размером...

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


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

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

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