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

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

17.03.2014, 03:02. Показов 1913. Ответов 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
5499 / 4894 / 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
5499 / 4894 / 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
5499 / 4894 / 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
5499 / 4894 / 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
5499 / 4894 / 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
5499 / 4894 / 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод Сайт называется reddit: The Thinkpad X220 Tablet is the best budget school laptop period. Это. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru