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

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

Войти
Регистрация
Восстановить пароль
 
Вованя
131 / 131 / 47
Регистрация: 20.02.2014
Сообщений: 453
#1

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

17.03.2014, 03:02. Просмотров 539. Ответов 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");
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2014, 03:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Заменить чтение из файла аналогом fstream (C++):

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

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

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

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

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

Запись/чтение структуры через fstream - C++
Доброго времени суток! у меня есть несколько вопросов по поводу файловых потоков. 1. Как можно записать/прочитать массив структур в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 03:13 #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");
Вованя
131 / 131 / 47
Регистрация: 20.02.2014
Сообщений: 453
17.03.2014, 03:15  [ТС] #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Какое отношение fscanf() имеет к чтению из файла?
Лол, самое непосредственное. Или я вопрос не понял, или что-то тут еще замешано.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 03:22 #4
Не обращайте внимания, уже исправил (С не С++).

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

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

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

Добавлено через 5 минут
Цитата Сообщение от Вованя Посмотреть сообщение
Дело в том, что в случае простого чтения все происходит, как задумано - читается в буфер и перемещается указатель и слова добавляются в словарь.
Цитата Сообщение от Вованя Посмотреть сообщение
Но если читать с помощью getline, то в buf1 записывается сразу же 255 символов
И зачем тогда вы используете getline()? Используйте, как вы пишите, "простое чтение". В чём проблема?
Вованя
131 / 131 / 47
Регистрация: 20.02.2014
Сообщений: 453
17.03.2014, 06:12  [ТС] #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
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2014, 06:30 #12
Цитата Сообщение от Вованя Посмотреть сообщение
А если слово будет более 255 символов? Переполнение же, а препод докапается.
Если чтение идёт в буфер, то возможное переполнение не зависит от метода чтения (хоть getline(), хоть >>). Знаю три пути:
1) буфер достаточного размера (почему только 256?);
2) сначала определяется размер того, что читается, потом под это динамически выделяется память;
3) использование классов с автоматическим управлением памятью (string).

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

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

Запись/чтение структур (файлы) + разница между FILE * и <fstream> - C++
Всем привет. Порыскал по форуму, погуглил... Решения есть, но они не ясны (что, почему да как) и не все работают. Однако, я так и не нашёл...

fstream, создание файла - C++
Привет всем, не могу справиться с проблемой. fstream file(FILE,ios::in|ios::out|ios::binary); файл не создается, но если создать...

Запись в середину файла - fstream - C++
Как можно при помощи fstream (хотелось бы именно им, потому что он умеет и читать, и писать) записать что-либо в середину файла (или куда...

Ошибка в копирование файла через fstream - C++
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main() { setlocale(0, &quot;&quot;); char...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
17.03.2014, 06:38
Ответ Создать тему
Опции темы

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