![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Есть код:
Задача: считать введенный пользователем текст, записать его в файл. - ну, дальше я сделал. НО! Программа выполняется В КОНСОЛИ! Т.е. это консольное приложение, а не Windows! Поскольку надо считать весь текст, введенный пользователем в консоль, тип char не подходит (ведь переменные этого типа хранят 1 символ). Я думаю, что тут подходит тип String. Но как записать переменную этого типа в файл? Обычные функции типа fprintf, fwrite, putc у меня не сработали. Что делать? |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
А что это за тип такой String?
И где ты в переменную текст-то считывешь? А если попробовать:
-------------------- Да. Именно так. |
|||
|
||||
| ManiaK |
|
||||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
В Си++ нет встроенного типа String. В стандартной библиотеке есть класс string. С помощью него можно сделать это так:
|
||||
|
|||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Кстати, я бы рекомендовал в fopen явно указывать текстовый или двоичный файл мы используем, т.е.
fopen("howmuch.txt","wt") для текстового и fopen("howmuch.txt","wb") для двоичного А то я видел реализации fopen, которые не знают типа файла по умолчанию и выдают ошибку. Это сообщение отредактировал(а) Дрон - 5.8.2005, 14:19 -------------------- Да. Именно так. |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Угу. У меня был компилятор какой-то, который глючил если не указать параметр 'b' и читал вместо текста ерунду какую-то. |
|||
|
||||
| mr.Anderson |
|
||||||||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Я это знаю. При описании своей проблемы я имел в виду именно библиотечный класс. Кстати, с маленькой буквы он у меня не пишется... Только с большой. Причем компайлер считает его типом AnsiString. Он чем-нибудь отличается?
Сейчас попробую. Добавлено @ 16:26 Да, Maniak, еще пара вопросов. В вашем коде написано
Вопрос 1. Разве надо писать "use"? А не "using"? Вопрос 2. Можно ли эту строку не писать, а написать вот так:
Или тут что-то не так? |
||||||||
|
|||||||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Так бы сразу и говорил, что используешь C++ Builder'ом! Тогда можно писать так: fputs(text.c_str(), file); или fprintf(fp,"%s", text.c_str()); или в двоичный файл: fwrite(text.c_str(), 1, strlen(text.c_str()), file); Это сообщение отредактировал(а) Дрон - 5.8.2005, 16:29 -------------------- Да. Именно так. |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Вопрос 3.
В вашей функции fwrite вы ничего не напутали с порядком аргументов? Вроде, по ее прототипу сначала должен идти размер вводимых данных, а уж только затем - количество блоков текста (кстати, что это такое - блоки?). Разве должно быть не так:
А? И потом, почему у вас в коде в аргументах этой функции стоит string, когда имя переменной text? (в приведенном тут своем коде я это поправил). Прошу ответить на все вопросы. Добавлено @ 16:31 Дрон, нет, стоп! Я пишу в Билдере, но через запущенный мастер Console Wizard, т.е. в принципе никакого билдера там нет... |
|||
|
||||
| ManiaK |
|
||||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Не знаю, я как-то экспериментировал с этими параметрами - что так, что так работает.
Если так, то мой способ правильнее. Сначала идёт размер одного блока данных (в данном случае - символ, 1 байт), а потом - количество блоков (тут правда описался, test.size() должно быть Всё это работает не только в Билдере. А вот String, судя по всему, чисто билдеровский тип. В стандартной библиотеке его нет. |
||||
|
|||||
| Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
А какие у тебя include написаны?
Да это не особо важно. Это имеет смысл скорее при чтении, т.к. fread возвращает именно количество прочитанных блоков, а не байт. Добавлено @ 16:47 Блок в данном случае -- это минимальный элемент данных. Например, если ты пишешь массив, то логично сделать так: кол-во блоков = кол-во элементов массива размер блока = sizeof(одного элемента массива) Хотя от того, что ты напишешь кол-во блоков = 1 размер блока = кол-во элементов массива * sizeof(элемента) ничего не изменится. Это сообщение отредактировал(а) Дрон - 5.8.2005, 16:53 -------------------- Да. Именно так. |
||||
|
|||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Maniak, странно как-то получается. В заранее определенной функции можно переставлять местами аргументы?! Вот это да.
Дрон, вот такие у меня инклуды:
А функцию мы используем fwrite, а не fread. Добавлено @ 16:51 ManiaK, да, кстати, я пару постов назад еще два вопроса задал. Ответье на них, пожалуйста. Это сообщение отредактировал(а) sim7 - 5.8.2005, 16:50 |
|||
|
||||
| Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Что и требовалось доказать VCL -- это и есть главная библиотека Билдера, в которой определены все классы вроде AnsiString, TForm и прочих Добавлено @ 16:53
1. Конечно using 2. Да. Только переменная называется text, а не string Это сообщение отредактировал(а) Дрон - 5.8.2005, 16:54 -------------------- Да. Именно так. |
||||
|
|||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
А-а-а... Она просто подрубается по умолчанию (при создании шаблона через Console Wizard она уже подключена), поэтому я ее и не вырубал - вдруг все работать перестанет?
|
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
sim7
Если ты её не подключишь, то у тебя не будет AnsiString -------------------- Да. Именно так. |
|||
|
||||
| ManiaK |
|
||||||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Отвлекаюсь, ошибки делаю
Для консоли можно. Добавлено @ 16:57
Ну и нафиг он не нужон... |
||||||
|
|||||||
| mr.Anderson |
|
||||||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
А он вообще нужен? Maniak, написал вот это:
Пишет ошибку:
Что такое? И еще: как в объявленную переменную text загнать текст, введенный пользователем в консоли? |
||||||
|
|||||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Уфф... Люди вы что, с Луны свалились?
Пиши
-------------------- Да. Именно так. |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Всё нормально, я эту ветку в закладки брошу - чуть что, сразу пошлю сюда |
|||
|
||||
| Дрон |
|
||||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Во-первых
Во-вторых
-------------------- Да. Именно так. |
||||||
|
|||||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Дрон, а как же тип string?
|
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Э-э-э... А что с ним не так? -------------------- Да. Именно так. |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Про загон понял, а все же, тип string куда девать? Как с ним сделать (уж очень с ним хочется
|
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
sim7
Так я ж его и использовал. Это сообщение отредактировал(а) Дрон - 5.8.2005, 17:08 -------------------- Да. Именно так. |
|||
|
||||
| Fixin |
|
||||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
|
||||
|
|||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
И еще: #include <iostream> и #include <iostream.h> эквивалентны или нет?
Про тип string - я имею в виду, ваша строчка отличается от той, что Maniak указал. Приведите весь фрагмент моего кода (который я в 1-м посте дал) в переделанной форме. |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Fixin
Уже есть. Просто fwrite первым параметром принимает void* -------------------- Да. Именно так. |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
А как же тогда? В общем, приведите весь код в целости (см предыдущий мой пост).
|
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
Да быстро очень... не успеваю
|
|||
|
||||
| Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Почти. Для iostream.h не надо приставки std:: перед cin. Просто в VS7, где я пишу есть только iostream
И кстати, если уж используем cin, то логичней вместо puts использовать cout. Это сообщение отредактировал(а) Дрон - 5.8.2005, 17:14 -------------------- Да. Именно так. |
||||
|
|||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
|
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Fixin
У тебя тоже string вместо text ЗЫ: Я от этой темы помру со смеху... Это сообщение отредактировал(а) Дрон - 5.8.2005, 17:15 -------------------- Да. Именно так. |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
А зачем? Разве есть разница, если надо вывести просто текст?
И еще вопрос. Если используется cin, то, значит, текст будет принят после нажатия Enter. А мне это не нужно. Ведь прога должна считать еще и количество переводов строки. Как это обеспечить? |
|||
|
||||
| Fixin |
|
||||||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
Ну если
|
||||||
|
|||||||
| Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Для единообразия.
А таких функций нет. Придумывай сам. И, кстати, а чем тогда окончание ввода будет обозначаться? -------------------- Да. Именно так. |
||||
|
|||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Fixin, как это? Объявлять указатель на файл надо (это я по учебнику делал). Иначе с файлом оперировать не получится...
|
|||
|
||||
| ManiaK |
|
||||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Дрон не флеймим
Зациклить. Что-то вроде:
|
||||
|
|||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
sim7
Он имеет ввиду, что надо использовать функции из iostream, а не из stdio... Но ты забудь... Не забивай голову Это сообщение отредактировал(а) Дрон - 5.8.2005, 17:19 -------------------- Да. Именно так. |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Да елки! Никогда не успеваю ответить до другого участника! Здорово!
Дрон, ну, предположим, будет символ ~ (тильда). Я просто не представляю, как увязать cout и символ конца ввода... |
|||
|
||||
| Fixin |
|
||||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
|
||||
|
|||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Ешкин кот! Опять не успел!
Maniak, но тогда ведь придется пользователю вводить текст посимвольно. Т.е. символ-энтер, символ-энтер и т.д. Я пробовал этот вариант, но он же неверный в данной задаче. |
|||
|
||||
| ManiaK |
|
||||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Никак. Тут можно так сделать (с тильдой):
|
||||
|
|||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
|
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
sim7
Я бы всё сделал вообще по-другому...
Ввод закончится либо после 1024 символов, либо по нажатию ESC -------------------- Да. Именно так. |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Ну, тогда ведь и получится, как я сказал, Maniak. А вводить текст побуквенно не совсем реально, по-моему.
|
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Fixin
Ну не очень... ЗЫ: Хочу на этой теме до 1000 постов дойти -------------------- Да. Именно так. |
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
|
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
При использовании функции getch нажатие необходимости в нажатии ввода нет.
|
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Дрон, интересное предложение... Можете объяснить свой код? А то я не совсем въехал... С указателями всегда путался...
|
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
|
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Maniak, у меня вообще при использовании getch() в консоли текст не вводится. Нажимаю клавиши, и никакой реакции. Я тоже хотел изначально такой способ использовать.
|
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Дрон, Fixin угомонитесь
|
|||
|
||||
| Fixin |
|
||||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
Добавлено @ 17:26
|
||||
|
|||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Я ж попросил объяснить, Fixin.
Добавлено @ 17:27
Абсолютно, за исключением энтеров. |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Модератор: если это продолжится - приму меры!
Код пожалуйста в студию. |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Этот код надо вставить за место всего того, что у тебя в блоке else. -------------------- Да. Именно так. |
|||
|
||||
| Дрон |
|
||||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Если присмотреться, то у меня используется getche, которая выводит символ на экран. // offtop
Я имел ввиду свою 1000 Вот уже и 1 пост остался. ManiaK Сорри. Меня просто от этой темы изначально расплющило... -------------------- Да. Именно так. |
||||
|
|||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Ах, да. Ну, пробовал вот так вот:
|
|||
|
||||
| Fixin |
|
||||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
2 ManiaKИзвини, не понял вопроса |
||||
|
|||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Fixin, а я-то думаю, чего у меня она не работала... Укажите ее прототип, плиз.
|
|||
|
||||
| Fixin |
|
||||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
Вот формат:
В твоем примере нужно так:
Буква "f" перед этой функцией обозначает форматный вывод. Про формат читай справку, должно быть Это сообщение отредактировал(а) Fixin - 5.8.2005, 17:54 |
||||
|
|||||
| ManiaK |
|
||||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Вот этот код:
Заменить на этот:
Тогда и символы вводимые будут отображаться и закончится ввод на тильде. |
||||
|
|||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Спасибо! Пойду пробовать. Сейчас отпишу, что получится.
Добавлено @ 18:15 Отлично! Maniak, полный порядок. Ваш код вполне сработал. Осталось только придать ему "красоты". Спасибо большое всем, кто мне тут помогал. Просто огромное спасибо. И еще: несмотря на то, что я использовал код без класса string, все равно его изучение в этой теме для меня лишним не было. |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Так. Стоп-с. Одна проблема. Enter вводить нельзя. Почему-то. Когда его нажимаешь, то указатель курсора в консоли становится на начало строки, и весь текст просто перетирается (переписывается) новыми буквами, которые я потом ввожу. Кстати, когда нажимаешь Backspace, то указатель тоже просто перемещается на 1 позицию назад, и при последующем вводе букв опять-таки просто "перетирает" символы. Как поправить?
|
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Что, устали отвечать? А как тут все бойко шло час назад... Эх...
Но эту проблему я сам решил. Если у кого еще будет такой вопрос, то надо просто подставить в код проверку на нажатие энтера вот таким вот кодом:
Вот и все! Теперь ваши консольные приложения будут вполне адекватно обрабатывать нажатие клавиши Enter. |
|||
|
||||
| Fixin |
|
|||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
Забой не работает тк ты читаешь каждый символ по отдельности из буфера и забираешь его. Потому ты не можешь удалить последний введенный символ из буфера тк его там уже нет.
С ентером прикольно получилось. |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Нравится? Сам радуюсь.
Теперь еще задача. Тоже с использованием типа string, наверное, поэтому, ув. модераторы, это не оффтопик. Задача такая. Пользователь вводит (опять же, в консоли) путь к файлу (естественно, в путь включено и имя). И вот надо открыть файл по указанному пути и обработать его. Я попробовал так:
Но компайлер ругается, что в прототипе функции fopen нет места переменным типа string. Так как же решить эту задачу? Это сообщение отредактировал(а) sim7 - 5.8.2005, 20:51 |
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Приведением к типу char*, уже писали сто раз.
Открой любой справочник по STL и найди там string. Не стоит засорять данный форум подобными вопросами. Я подниму вопрос по созданию чего-нибудь вроде школьного форума по Си++ раз такое дело получается, но вообще гораздо выгоднее дойти до технического решения самому - проще потом будет. |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Это понятно, но я бы, конечно, не догадался так сделать. Спасибо! Сейчас буду пробовать.
|
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Программа-то скомпайлилась, но не так работает, как надо. Что бы я в консольном окне не написал, прога все равно пишет, что не может открыть файл... Код-то верный, может, я что не так набираю? Как надо писать имя файла в консоли? Пример приведите.
Если надо, вот код:
|
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Как и в gui. Если не работает, значит считываешь имя файла не так(если считываешь посимвольно, то проверь чтобы в имя файла не попадали символы быкспейса и ентера). В конце концов выведи file_name на экран/посмотри в отладчике. и еще - while((x==getc(c_file))!=EOF) заменить на while((x=getc(c_file))!=EOF). Кстати, а компилер не ругается? ЗЫ. Если указываешь имя файла в коде, то не забывай удваивать все \ знаки - то есть rebuild rebuild_source_file("c:\\autoexec.bat") ЗЫЫ. Ой нафлудили |
|||
|
||||
| Guest |
|
||||||
|
Unregistered |
(Guest это был Mayk)
Ну чтобы эта мессага не совсем флуд была, то выскажу еще свое имхо, что смешивать С++ с С нехорошо. В плюсах есть удобные fstream для файлов. И еще -
вместо gets стоит использовать fgets
|
||||||
|
|||||||
| Fixin |
|
||||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
|
||||
|
|||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Да так же - константа EOF, которую возвращает fgetc при конце файла, равна -1(0xFFFFFFFF), в то время как размер char'а ограничен одним байтом(0xFF максимум). Ну двумя, если мы о wchar_t будем говорить. Поэтому fgetc'у нет принципиальной разницы, бинарен файл, или нет. Плюс еще feof(FILE* stream) есть. Только из контекста я понял, что файл как раз текстовой, а не бинарный. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
sim7
Маленькое замечание. Двойные кавычки в контексте C++ в большинстве случаев используются для обозначение строки. "\n" - хоть ошибкой и не является, но в некоторых местах программы это может сбить с толку читающего программу. |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Да, файл текстовый.
А про двойные кавычки - это о чем? Где я их вместо одинарных использовал? Что-то не найду никак... И я еще раз повторюсь. Прога вообще не воспринимает имя файла. В консоли пишу:
По коду после этого ввода запускается описанная выше функция rebuild_source_file(std::string file_name) с новым значением. Файл newtext.txt расположен в директории самой программы, поэтому нет смысла указывать путь. Однако, выдается Fatal Error (по моему коду это тогда, когда файл нельзя открыть). Так в чем же дело-то?! |
|||
|
||||
| Fixin |
|
||||
![]() Ёжик ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1357 Регистрация: 6.1.2004 Репутация: 2 Всего: 18 |
Измени код
Добавлено @ 20:14 И посмотри, что напишет. |
||||
|
|||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Ладно, сейчас попробую.
|
|||
|
||||
| mr.Anderson |
|
||||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Я для верности вставил имя файла в кавычки, так он нарисовал в этих кавычках квадратик, а затем несколько пробелов, общая длина которых равна длине имени файла! А вы сами попробуйте! Вот мой полный код:
Имя файла у меня "text.txt". Я его изначально создал в директории программы и попытался открыть. Ноль внимания (в смысле, ошибка). И еще вопрос. Почему, когда я переменную file_name заранее переделал в строковый тип вот так:
Чтобы потом не забывать это писать и не ошибаться, компайлер снова заорал, что в fopen не может быть типа char (!)? |
||||
|
|||||
| Void |
|
||||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
sim7
Давайте уже определяться, что мы используем - сишные строки и stdio или std::string и iostreams. Потому что одно с другим плохо сочетается.
Вот за это люди и не любят stdio. Компилятор молча пропустил грубейшую ошибку: если в строке формата стоит %s, то в качестве параметра должен быть char*, ссылающийся на буфер достаточной длины. А мы что передали? Правильно, указатель на объект типа std::string. Что у нас получилось? Правильно, undefined behaviour и вообще повезло, что все сразу не упало.
Это попытка избежать варнинга? Неудачная, потому что в данном случае надо именно:
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||||
|
|||||||
| mr.Anderson |
|
||||||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
А как с ними делать надо? Перепишите мой код по новой...
А как же надо? Ведь имя файла не может быть типа char, он же хранит 1 символ...
Вот это действительно моя ошибка. В общем, перепишите мой код со string. А тоя так до след. года биться буду. |
||||||
|
|||||||
| mr.Anderson |
|
||||||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
УРА!!!
Однако, осталась проблема. В файле text.txt, который я открываю через эту программу, находится текст:
Но программа, выводя содержимое файла через инструкцию else в функции перестройки файла в моем коде, выводит какие-то цифры:
Почему так и как это исправить? |
||||||
|
|||||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Люди! Я вопрос задал! Почему читается не текст, а цифры (см. пред. пост)?! Помогите!
|
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
sim7
Очень просто - x имеет тип int - целое число. И в cout выводится в соответствующем виде. Можно сделать вот так: cout << char(x); Или вовсе перейти полностью на потоки:
std::string умеет сам выводиться в поток, поэтому писать cout << s.c_str() бессмысленно. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Спасибо, разобрался. Действительно, дело было в типе. Я объявил ее как int, потому что в учебнике было написано:
|
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
sim7
В учебнике написано правильно. Но это расчитано на модель ввода/вывода stdio, где типы всегда указываются явно. А здесь опять пошла мешанина из потоков и stdio. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Ну, надо же. А я уж было собрался в учебнике править...
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |