Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556

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

17.03.2014, 03:02. Показов 1957. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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");
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.03.2014, 03:02
Ответы с готовыми решениями:

Fstream - чтение из файла
подскажите начинающему программисту как читать файл целиком.. например последовательность чисел

Чтение всего файла fstream
В общем мне казалась задача вполне очевидна и частая считать файл целиком в строку, но почему-то я не нашёл ничего готового (типа...

Чтение файла через fstream
прочитать из файла матрицу и записать в новый файл её минимальный элемент в первой строке задана размерность матрицы файл: 10 8 ...

12
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 03:13
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");
1
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
17.03.2014, 03:15  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Какое отношение fscanf() имеет к чтению из файла?
Лол, самое непосредственное. Или я вопрос не понял, или что-то тут еще замешано.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 03:22
Не обращайте внимания, уже исправил (С не С++).

Добавлено через 3 минуты
Тогда уж и другое в С++ лучше написать.
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
17.03.2014, 03:32  [ТС]
Спасибо, только сначала не работало, здесь тоже требуется оператор отрицания
Цитата Сообщение от alsav22 Посмотреть сообщение
while(!open.eof())
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 03:39
Цитата Сообщение от Вованя Посмотреть сообщение
только сначала не работало, здесь тоже требуется оператор отрицания
Прошу прощения, мой косяк. Конечно требует оператор отрицания.

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

Добавлено через 2 минуты
Цитата Сообщение от Вованя Посмотреть сообщение
А не подскажите, как можно в случае чтения из файла в буфер типа char buf[256] ограничить количество читаемых символов, дабы избежать переполнения? get и getline читают до упора
Не читают они до упора. Второй параметр - максимальное количество символов, которое будет считано, плюс один (для добавляемого функцией терминального ноля).
Цитата Сообщение от Вованя Посмотреть сообщение
то есть как, например, в функции fgets?
Так они и работают.
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
17.03.2014, 05:48  [ТС]
Цитата Сообщение от 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.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 06:00
Цитата Сообщение от Вованя Посмотреть сообщение
В контексте всей программы это видно, чем занимается + - добавляет элементы.
Что думаю об этом уже написал, плохая перегрузка.
Цитата Сообщение от Вованя Посмотреть сообщение
Дело в том, что в случае простого чтения все происходит, как задумано - читается в буфер и перемещается указатель и слова добавляются в словарь.
Трудно понять проблему. Догадываюсяь, что в строке расположено несколько слов и их нужно считать в разные переменные (или в одну, но последовательно (gets(), то здесь тогда причём? Она тоже всю строку прочтёт.)) Пример строки привидите, и что с ней нужно сделать. Так будет понятнее.

Добавлено через 5 минут
Цитата Сообщение от Вованя Посмотреть сообщение
Дело в том, что в случае простого чтения все происходит, как задумано - читается в буфер и перемещается указатель и слова добавляются в словарь.
Цитата Сообщение от Вованя Посмотреть сообщение
Но если читать с помощью getline, то в buf1 записывается сразу же 255 символов
И зачем тогда вы используете getline()? Используйте, как вы пишите, "простое чтение". В чём проблема?
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
17.03.2014, 06:12  [ТС]
Цитата Сообщение от 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();
И файл
Code
1
mother мама father папа son сын daughter дочь brother брат sister сестра grandma бабушка grandpa дедушка uncle дядя aunt тетя
Соответственно нечетные слова - ключи, четные - значения.
Хотелось бы все за один проход прочитать и добавить, с ограничением по слову.

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

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

Добавлено через 2 минуты
Цитата Сообщение от Вованя Посмотреть сообщение
file.getline(buf2, 255);
И не нужно уменьшать второй параметр на единицу, getliine() сама считает на единицу меньше, чем второй параметр (оставит место для '\0').
1
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
17.03.2014, 06:38  [ТС]
Ясно, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.03.2014, 06:38
Помогаю со студенческими работами здесь

Чтение/Редактирование/Создание Файла без fstream
fstream конфликтует с используемой мною библиотекой ImGui, при создании объекта для fstream ( прим. std::fstream fileobj; ...

Чтение файла в массив символов используя fstream
Добрый день. Нужно считать файл в массив символов(vector). Использую fstream.

Как начать чтение файла сначала после Getline с первой строчки в fstream?
Пишу программу,которая читает строки их текстового файла и передаёт их в поле Edit1 поочерёдно,по нажатию кнопки.Когда строки...

Как заменить чтение строки из консоли на чтение текстового файла?
основное задание: найти частоту суффикса (например, &quot;ing&quot;) в текстовом документе. в прикреплённом коде текст вводится прямо в консоль,...

fstream не работает и чтение и запись
Добрый день! Не пойму, почему введение функции getline становится причиной того, что запись в файл не идет. Если getline убрать, то все...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru