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

Заменить чтение из файла аналогом fstream - C++

Восстановить пароль Регистрация
 
Вованя
116 / 116 / 46
Регистрация: 20.02.2014
Сообщений: 416
17.03.2014, 03:02     Заменить чтение из файла аналогом fstream #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        char fileName[256];
        printf("Enter file name: ");
        scanf("%255s", fileName);
        FILE *open = fopen(fileName, "r");
        if(open)
            while(!feof(open))
            {
                fscanf(open, "%2d", &choice);
                if(choice == 1)
                    first_type + choice;
                if(choice == 2)
                    second_type + choice;
            }
        else printf("Error while opening!\n");
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2014, 03:02     Заменить чтение из файла аналогом fstream
Посмотрите здесь:

запись/чтение структуры через fstream C++
C++ fstream, создание файла
C++ fstream не работает и чтение и запись
Запись/чтение структур (файлы) + разница между FILE * и <fstream> C++
Запись в середину файла - fstream C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 03:13     Заменить чтение из файла аналогом fstream #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char fileName[256];
    printf("Enter file name: ");
    scanf("%255s", fileName);
    ifstream open(fileName);
    if(open)
        while(open.eof())
        {
            open >> choice);
            if(choice == 1)
                first_type + choice;
            if(choice == 2)
                second_type + choice;
        }
    else printf("Error while opening!\n");
Вованя
116 / 116 / 46
Регистрация: 20.02.2014
Сообщений: 416
17.03.2014, 03:15  [ТС]     Заменить чтение из файла аналогом fstream #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Какое отношение fscanf() имеет к чтению из файла?
Лол, самое непосредственное. Или я вопрос не понял, или что-то тут еще замешано.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 03:22     Заменить чтение из файла аналогом fstream #4
Не обращайте внимания, уже исправил (С не С++).

Добавлено через 3 минуты
Тогда уж и другое в С++ лучше написать.
Вованя
116 / 116 / 46
Регистрация: 20.02.2014
Сообщений: 416
17.03.2014, 03:32  [ТС]     Заменить чтение из файла аналогом fstream #5
Спасибо, только сначала не работало, здесь тоже требуется оператор отрицания
Цитата Сообщение от alsav22 Посмотреть сообщение
while(!open.eof())
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 03:39     Заменить чтение из файла аналогом fstream #6
Цитата Сообщение от Вованя Посмотреть сообщение
только сначала не работало, здесь тоже требуется оператор отрицания
Прошу прощения, мой косяк. Конечно требует оператор отрицания.

Добавлено через 4 минуты
Ещё и скобку лишнюю оставил в 8 строке. А что это за действия странные (не имеющие результатов)?
C++
1
2
3
4
...
first_type + choice;
...
second_type + choice;
Вованя
116 / 116 / 46
Регистрация: 20.02.2014
Сообщений: 416
17.03.2014, 05:22  [ТС]     Заменить чтение из файла аналогом fstream #7
Цитата Сообщение от alsav22 Посмотреть сообщение
А что это за действия странные (не имеющие результатов)?
Перегруженный оператор для стека, простой push.
А не подскажите, как можно в случае чтения из файла в буфер типа char buf[256] ограничить количество читаемых символов, дабы избежать переполнения? get и getline читают до упора, а надо только лишь слово, ограниченное 255 символами, то есть как, например, в функции fgets?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 05:39     Заменить чтение из файла аналогом fstream #8
Цитата Сообщение от Вованя Посмотреть сообщение
Перегруженный оператор для стека, простой push.
Если перегруженный, тогда понятно. Но обратите внимание: понятно только вам, а не тому кто читает код, что говорит о плохой продуманности перегрузки. Синтаксис хорошей перегрузки, должен быть таким же, как и для встроенных типов, в чём, вообщем-то, и смысл таких перегрузок: сделать синтаксис привычным и для встроенных типов.

Добавлено через 2 минуты
Цитата Сообщение от Вованя Посмотреть сообщение
А не подскажите, как можно в случае чтения из файла в буфер типа char buf[256] ограничить количество читаемых символов, дабы избежать переполнения? get и getline читают до упора
Не читают они до упора. Второй параметр - максимальное количество символов, которое будет считано, плюс один (для добавляемого функцией терминального ноля).
Цитата Сообщение от Вованя Посмотреть сообщение
то есть как, например, в функции fgets?
Так они и работают.
Вованя
116 / 116 / 46
Регистрация: 20.02.2014
Сообщений: 416
17.03.2014, 05:48  [ТС]     Заменить чтение из файла аналогом fstream #9
Цитата Сообщение от alsav22 Посмотреть сообщение
понятно только вам
Просто задание такое, я выбрал такой способ перегрузки. В контексте всей программы это видно, чем занимается + - добавляет элементы.

Цитата Сообщение от alsav22 Посмотреть сообщение
Не читают они до упора.
Дело в том, что в случае простого чтения все происходит, как задумано - читается в буфер и перемещается указатель и слова добавляются в словарь.
C++
1
2
3
4
5
6
        while(!file.eof())
        {
            file >> buf1;
            file >> buf2;
            dict.insert(buf1,buf2)
        }
Но если читать с помощью getline, то в buf1 записывается сразу же 255 символов
C++
1
2
3
4
5
6
        while(!file.eof())
        {
            file.getline(buf1, 255);
            file.getline(buf2, 255);
            dict.insert(buf1,buf2);
        }
Как можно в таком случае и рыбку съесть и код не усложнять, но ограничить кол-во символов?
Просто в этом случае прекрасно справляется и Сишный fscanf, но нужно обязательно использовать потоки fstream.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 06:00     Заменить чтение из файла аналогом fstream #10
Цитата Сообщение от Вованя Посмотреть сообщение
В контексте всей программы это видно, чем занимается + - добавляет элементы.
Что думаю об этом уже написал, плохая перегрузка.
Цитата Сообщение от Вованя Посмотреть сообщение
Дело в том, что в случае простого чтения все происходит, как задумано - читается в буфер и перемещается указатель и слова добавляются в словарь.
Трудно понять проблему. Догадываюсяь, что в строке расположено несколько слов и их нужно считать в разные переменные (или в одну, но последовательно (gets(), то здесь тогда причём? Она тоже всю строку прочтёт.)) Пример строки привидите, и что с ней нужно сделать. Так будет понятнее.

Добавлено через 5 минут
Цитата Сообщение от Вованя Посмотреть сообщение
Дело в том, что в случае простого чтения все происходит, как задумано - читается в буфер и перемещается указатель и слова добавляются в словарь.
Цитата Сообщение от Вованя Посмотреть сообщение
Но если читать с помощью getline, то в buf1 записывается сразу же 255 символов
И зачем тогда вы используете getline()? Используйте, как вы пишите, "простое чтение". В чём проблема?
Вованя
116 / 116 / 46
Регистрация: 20.02.2014
Сообщений: 416
17.03.2014, 06:12  [ТС]     Заменить чтение из файла аналогом fstream #11
Цитата Сообщение от alsav22 Посмотреть сообщение
Пример строки приведите
Само чтение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    char buf1[256], buf2[256];
    BinaryTree dict;
    std::ifstream file("dict.txt");
    if(file.is_open())
    {
        while(!file.eof())
        {
            file >> buf1;
            file >> buf2;
            //file.getline(buf2, 255);
            dict.insert(buf1,buf2);
        }
    }
    else std::cout << "Error while opening!\n";
    std::cout << std::endl;
    dict.print_tree();
И файл
Код
mother мама father папа son сын daughter дочь brother брат sister сестра grandma бабушка grandpa дедушка uncle дядя aunt тетя
Соответственно нечетные слова - ключи, четные - значения.
Хотелось бы все за один проход прочитать и добавить, с ограничением по слову.

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
В чём проблема?
А если слово будет более 255 символов? Переполнение же, а препод докапается.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 06:30     Заменить чтение из файла аналогом fstream #12
Цитата Сообщение от Вованя Посмотреть сообщение
А если слово будет более 255 символов? Переполнение же, а препод докапается.
Если чтение идёт в буфер, то возможное переполнение не зависит от метода чтения (хоть getline(), хоть >>). Знаю три пути:
1) буфер достаточного размера (почему только 256?);
2) сначала определяется размер того, что читается, потом под это динамически выделяется память;
3) использование классов с автоматическим управлением памятью (string).

Добавлено через 2 минуты
Цитата Сообщение от Вованя Посмотреть сообщение
И файл
Из одной строки?

Добавлено через 2 минуты
Цитата Сообщение от Вованя Посмотреть сообщение
file.getline(buf2, 255);
И не нужно уменьшать второй параметр на единицу, getliine() сама считает на единицу меньше, чем второй параметр (оставит место для '\0').
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2014, 06:38     Заменить чтение из файла аналогом fstream
Еще ссылки по теме:

C++ Чтение всего файла fstream
Fstream - чтение из файла C++
C++ Как начать чтение файла сначала после Getline с первой строчки в fstream?

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

Или воспользуйтесь поиском по форуму:
Вованя
116 / 116 / 46
Регистрация: 20.02.2014
Сообщений: 416
17.03.2014, 06:38  [ТС]     Заменить чтение из файла аналогом fstream #13
Ясно, спасибо.
Yandex
Объявления
17.03.2014, 06:38     Заменить чтение из файла аналогом fstream
Ответ Создать тему
Опции темы

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