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

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

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

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

09.05.2012, 03:30. Просмотров 1572. Ответов 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. забыл добавить, чтобы после удаление все сохранило в файл(но это не проблема).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2012, 03:30     Считать из файла только числа
Посмотрите здесь:

C++ Считать текст из файла и вывести на экран только предложения, не содержащие запятых
C++ Считать текст из файла, и вывести только предложения, в которых нет запятой
Считать текст из файла и вывести на экран только предложения начинающиеся с тире C++
Считать текст из файла и вывести на экран только предложения, не содержащие запятых C++
C++ Из одного файла считать целые числа, в другие файлы записать четные и нечетные числа
Считать из текстового файла только определенные строки C++
C++ Считать текст из файла и вывести на экран только предложения, начинающиеся с тире
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт CЭксперт С++
 Аватар для MrGluck
6235 / 3480 / 428
Регистрация: 29.11.2010
Сообщений: 9,211
09.05.2012, 04:42     Считать из файла только числа #2
А мб вобще работать с бинарными файлами? Тогда числа будут занимать равное количество байтов и процесс удаления будет куда проще.

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

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

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

Если удалять нужно из файла, то после удаления из массива следует синхронизировать содержимое массива и файла: сбросить занятую часть массива в файл (открыть файл для записи и т.д.)
cetrael
 Аватар для 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 Да, удалить нужно из файла, сохраним потом ещё файл. Спасибо.
MrGluck
Ворчун
Эксперт CЭксперт С++
 Аватар для MrGluck
6235 / 3480 / 428
Регистрация: 29.11.2010
Сообщений: 9,211
09.05.2012, 14:25     Считать из файла только числа #5
Цитата Сообщение от cetrael Посмотреть сообщение
А это зачем?
Иначе у тебя цикл выполняется пока не конец файла либо пока происходит ошибка в операции с файлом.

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

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

Ввести в программу строку (числа, латиница), считать только числа, записать числа в массив C++
C++ Считать текст из файла, и вывести на экран только строки, содержащие двузначные числа
C++ Считать текст из файла и вывести на экран только предложения не содержащие запятых
Файл: Из текста файла считать только цифры C++

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

Или воспользуйтесь поиском по форуму:
Catstail
Модератор
 Аватар для Catstail
21794 / 10518 / 1706
Регистрация: 12.02.2012
Сообщений: 17,536
09.05.2012, 15:30     Считать из файла только числа #9
Да, ты права.
Yandex
Объявления
09.05.2012, 15:30     Считать из файла только числа
Ответ Создать тему
Опции темы

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