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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
cetrael
60 / 5 / 3
Регистрация: 01.10.2011
Сообщений: 93
#1

Считать из файла только числа - C++

09.05.2012, 03:30. Просмотров 1906. Ответов 8
Метки нет (Все метки)

Сделал класс, который загружает текстовый файл в массив(целочисленный) и имеет функцию удаления числа из файла.
C++
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
#include <fstream>
using namespace std;
 
class Txt 
{
private:
    int *arr;//указатель на целочисленный массив
    ifstream ifile;//входной поток
    unsigned int count;//счетчик количества чисел в файле
public:
    Txt(char* filename)
    {
        int buf = 0;
        ifile.open(filename, ios::in);
        ifile.seekg(-1, ios::end);
        int len = ifile.tellg();
        ifile.seekg(0, ios::beg);
        arr = new int[len / 2 + 1];
        count = 0;
        while(!ifile.eof() || ifile.bad())
        {
 
            ifile >> arr[count];
            count++;
        }
    }
    void See (void)
    {
        if(!count)
            cout << "No array!" << endl;
        else
        {
            for(int i = 0; i < count; i++)
                cout << arr[i] << " ";
        }
    }
    bool Del (int n)
    {
        while(Check(n))
        {
            for(int i = 0; i < count; i++)
            {
                if(arr[i] == n)
                {
                    for(i; i + 1 < count; i++)
                    {
                        arr[i] = arr[i+1];
                    }
                    count--;
                    if(count == 0) {cout << "File is empty" << endl; return 0;}
                    int *temp = new int[count];
                    for(int i = 0; i < count; i++)
                        temp[i] = arr[i];
                    delete [] arr;
                    arr = new int[count];
                    for(int i = 0; i < count; i++)
                        arr[i] = temp[i];
                    delete [] temp;
                }
            }
        }
    }
    bool Check (int n)
    {
        for(int i = 0; i < count; i++)
            if(arr[i] == n)
                return true;
        return false;
    }
};
 
int main () 
{
    Txt txt("asd.txt");
    txt.See();
    cout << endl;
    txt.Del(1);
    txt.See();
    return 0;
}
Во-первых, как сделать, чтобы считывались только числа, потому что, если добавить в файл пробелов - программа сломается :P
Во-вторых, знающие люди, оцените функцию удаления.
В-третьих, нужна критика по коду.
P.S. забыл добавить, чтобы после удаление все сохранило в файл(но это не проблема).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2012, 03:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Считать из файла только числа (C++):

Считать текст из файла, и вывести на экран только строки, содержащие двузначные числа - C++
Помогите пожалуйста написать программу, которая считывает текст из файла и выводит на экран только строки, содержащие двузначные числа.

Ввести в программу строку (числа, латиница), считать только числа, записать числа в массив - C++
Нужна помощь! Срочно! Нужно ввести в программу строку (числа, латиница), считать только числа, записать числа в массив. Помогите,...

Файл: Из текста файла считать только цифры - C++
В общем мне надо чтобы из текста файла считывались только числа, например из предложения Today is 8th of August. Temperature is 28...

Считать из текстового файла только определенные строки - C++
считать из текстового файла например строки с 6 по 9, или с 3 по 19 и записать их в другой текстовый файл

Из одного файла считать целые числа, в другие файлы записать четные и нечетные числа - C++
Нужно с одного файла считать целые числа и в другие файлы записать четные и нечетные числа. Вот код, но почему-то не работает...и как...

Считать текст из файла, и вывести только предложения, в которых нет запятой - C++
Написать програму которая считывает текст из файла и выводит на екран только предложения в которых нету запятой? Это надо сделать через...

8
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,631
09.05.2012, 04:42 #2
А мб вобще работать с бинарными файлами? Тогда числа будут занимать равное количество байтов и процесс удаления будет куда проще.

Насчет критики - разделил бы объявление класса и его реализацию, проще ориентироваться по методам, что ли. Объявил бы явно деструктор, все-таки с памятью работаешь, надо её освобождать.

C++
1
while(!ifile.eof() || ifile.bad())
на
C++
1
while(!ifile.eof() && !ifile.bad())
Ну и через векторы и алгоритмы STL все было б куда проще) А то делать динамический массив, уповая на размер файла - метод бобра-извращенца (ИМХО). Надеюсь не обидел)
1
Catstail
Модератор
22909 / 11275 / 1833
Регистрация: 12.02.2012
Сообщений: 18,487
09.05.2012, 09:40 #3
Задача сформулирована некорректно. Неясно, откуда нужно удалить число: из массива или из файла. Если из массива, то на беглый взгляд - удаление выполнено верно (сдвиг влево всех элементов за удаляемым на одну позицию). Ну, а если число n встречается более одного раза? Тогда метод удалит первое, а остальные оставит.

Кроме того, поскольку Del возвращает значение, все выходы из нее должны завершаться оператором return (пропущен после delete temp)
Кстати, нужны ли скобки в этом выражении "delete [] temp"? По-моему - нет.

Если удалять нужно из файла, то после удаления из массива следует синхронизировать содержимое массива и файла: сбросить занятую часть массива в файл (открыть файл для записи и т.д.)
1
cetrael
60 / 5 / 3
Регистрация: 01.10.2011
Сообщений: 93
09.05.2012, 13:59  [ТС] #4
Цитата Сообщение от MrGluck Посмотреть сообщение
А мб вобще работать с бинарными файлами? Тогда числа будут занимать равное количество байтов и процесс удаления будет куда проще.
Ну нужно именно текстовый файл, исключительно лабораторные цели.
Цитата Сообщение от MrGluck Посмотреть сообщение
Насчет критики - разделил бы объявление класса и его реализацию, проще ориентироваться по методам, что ли. Объявил бы явно деструктор, все-таки с памятью работаешь, надо её освобождать.
Да, действительно, совсем забыл про хидеры и деструкторы. Спасибо.
Цитата Сообщение от MrGluck Посмотреть сообщение
C++
1
while(!ifile.eof() || ifile.bad())
на
C++
1
while(!ifile.eof() && !ifile.bad())
А это зачем?
Цитата Сообщение от MrGluck Посмотреть сообщение
Ну и через векторы и алгоритмы STL все было б куда проще) А то делать динамический массив, уповая на размер файла - метод бобра-извращенца (ИМХО). Надеюсь не обидел)
Опять же, исключительно учебные цели)
Цитата Сообщение от Catstail Посмотреть сообщение
Задача сформулирована некорректно. Неясно, откуда нужно удалить число: из массива или из файла. Если из массива, то на беглый взгляд - удаление выполнено верно (сдвиг влево всех элементов за удаляемым на одну позицию). Ну, а если число n встречается более одного раза? Тогда метод удалит первое, а остальные оставит.
Если более одного раза, то тоже должно сработать, там ведь удаление, пока Check()?
Цитата Сообщение от Catstail Посмотреть сообщение
Кроме того, поскольку Del возвращает значение, все выходы из нее должны завершаться оператором return (пропущен после delete temp)
Кстати, нужны ли скобки в этом выражении "delete [] temp"? По-моему - нет.
А почему с arr нужны, а с temp не нужны?
Цитата Сообщение от Catstail Посмотреть сообщение
Если удалять нужно из файла, то после удаления из массива следует синхронизировать содержимое массива и файла: сбросить занятую часть массива в файл (открыть файл для записи и т.д.)
Написал же об этом в P.S Да, удалить нужно из файла, сохраним потом ещё файл. Спасибо.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,631
09.05.2012, 14:25 #5
Цитата Сообщение от cetrael Посмотреть сообщение
А это зачем?
Иначе у тебя цикл выполняется пока не конец файла либо пока происходит ошибка в операции с файлом.

Добавлено через 3 минуты
Кстати, насчет пробелов:
Можно обойти файл, посчитать количество элементов, потом выделить память под динамический массив, и вторым циклом уже считывать в него элементы.
1
cetrael
60 / 5 / 3
Регистрация: 01.10.2011
Сообщений: 93
09.05.2012, 14:40  [ТС] #6
Цитата Сообщение от MrGluck Посмотреть сообщение
Иначе у тебя цикл выполняется пока не конец файла либо пока происходит ошибка в операции с файлом.

Добавлено через 3 минуты
Кстати, насчет пробелов:
Можно обойти файл, посчитать количество элементов, потом выделить память под динамический массив, и вторым циклом уже считывать в него элементы.
Хорошая идея, а ещё вопрос, как мне сделать проверку, чтобы с файла считывались исключительно числа, то есть пробелы и всякий лишний мусор не воспринимался. isdigit работает только от 0 до 9 :C
0
Catstail
Модератор
22909 / 11275 / 1833
Регистрация: 12.02.2012
Сообщений: 18,487
09.05.2012, 14:58 #7
И с arr не нужны, по-моему. Просто проглядел.
0
cetrael
60 / 5 / 3
Регистрация: 01.10.2011
Сообщений: 93
09.05.2012, 15:04  [ТС] #8
Цитата Сообщение от Catstail Посмотреть сообщение
И с arr не нужны, по-моему. Просто проглядел.
http://www.cplusplus.com/reference/std/new/operator%20delete[]/
Написано же, если выделяем new[], то и удаляем delete[]
0
Catstail
Модератор
22909 / 11275 / 1833
Регистрация: 12.02.2012
Сообщений: 18,487
09.05.2012, 15:30 #9
Да, ты права.
0
09.05.2012, 15:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2012, 15:30
Привет! Вот еще темы с ответами:

Считать текст из файла и вывести на экран только предложения начинающиеся с тире - C++
Дан преподавателем код программы для самостоятельного разбора. Помогите понять какая ошибка в 44 строке. #include &lt;iostream&gt; #include...

Считать текст из файла и вывести на экран только предложения, начинающиеся с тире - C++
Помогите пожалуйста, не знаком с работой с файлами в плюсах и не силен в работе со строками. Нужно написать программу, которая считывает...

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

Считать текст из файла и вывести на экран только предложения не содержащие запятых - C++
написать программу которая считывает текст из файла и выводит на экран только предложения не содержащие запятых. Только сделать это надо...


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

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

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