![]() |
|
Модераторы: 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
Ну и нафиг он не нужон... |
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |