Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Тип String 
:(
    Опции темы
mr.Anderson
Дата 5.8.2005, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Есть код:
Код

void save_how_much(void)
{
 FILE *file;
 if((file=fopen("howmuch.txt","w"))==NULL)
 {
  puts("Fatal error: Can't open file to write!\n\nProgram aborted. Press any key...");
  getch();
  abort();
 }
 else
 {
  char y;
  puts("Enter your text.\n");
  String text; 
  // - тут надо вписать код записи в файл - //
  fclose(file);
 }
}

Задача: считать введенный пользователем текст, записать его в файл. - ну, дальше я сделал.
НО! Программа выполняется В КОНСОЛИ! Т.е. это консольное приложение, а не Windows!
Поскольку надо считать весь текст, введенный пользователем в консоль, тип char не подходит (ведь переменные этого типа хранят 1 символ). Я думаю, что тут подходит тип String. Но как записать переменную этого типа в файл? Обычные функции типа fprintf, fwrite, putc у меня не сработали.
Что делать?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Дрон
Дата 5.8.2005, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



А что это за тип такой String?
И где ты в переменную текст-то считывешь?

А если попробовать:
Код

char str[256];
gets(str);
fputs(str, file);



--------------------
Да. Именно так.
PM   Вверх
ManiaK
Дата 5.8.2005, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



Цитата(sim7 @ 5.8.2005, 14:58)
Я думаю, что тут подходит тип String.

В Си++ нет встроенного типа String. В стандартной библиотеке есть класс string. С помощью него можно сделать это так:
Код

#include <string>

use namespace std;

void save_how_much(void)    
{    
 FILE *file;    
 if((file=fopen("howmuch.txt","w"))==NULL)    
 {    
  puts("Fatal error: Can't open file to write!\n\nProgram aborted. Press any key...");    
  getch();    
  abort();    
 }    
 else    
 {    
  char y;    
  string text = "Некоторый текст";    
  fwrite(string, 1, string.size(), file);// - тут надо вписать код записи в файл - //    
  fclose(file);    
 }    
}

PM MAIL WWW   Вверх
Дрон
Дата 5.8.2005, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Кстати, я бы рекомендовал в fopen явно указывать текстовый или двоичный файл мы используем, т.е.

fopen("howmuch.txt","wt") для текстового
и
fopen("howmuch.txt","wb") для двоичного

А то я видел реализации fopen, которые не знают типа файла по умолчанию и выдают ошибку.

Это сообщение отредактировал(а) Дрон - 5.8.2005, 14:19


--------------------
Да. Именно так.
PM   Вверх
ManiaK
Дата 5.8.2005, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



Цитата
А то я видел реализации fopen, которые не знают типа файла по умолчанию и выдают ошибку.

Угу. У меня был компилятор какой-то, который глючил если не указать параметр 'b' и читал вместо текста ерунду какую-то.
PM MAIL WWW   Вверх
mr.Anderson
Дата 5.8.2005, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Цитата
В Си++ нет встроенного типа String. В стандартной библиотеке есть класс string.

Я это знаю. При описании своей проблемы я имел в виду именно библиотечный класс. Кстати, с маленькой буквы он у меня не пишется... Только с большой. Причем компайлер считает его типом AnsiString. Он чем-нибудь отличается?
Цитата
С помощью него можно сделать это так

Сейчас попробую. smile
Добавлено @ 16:26
Да, Maniak, еще пара вопросов. В вашем коде написано
Код

use namespace std;

Вопрос 1. Разве надо писать "use"? А не "using"?
Вопрос 2. Можно ли эту строку не писать, а написать вот так:
Код

char y;    
std::string text="Некоторый текст";    
fwrite(string, 1, string.size(), file);

Или тут что-то не так?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Дрон
Дата 5.8.2005, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Цитата(sim7 @ 5.8.2005, 17:23)
При описании своей проблемы я имел в виду именно библиотечный класс. Кстати, с маленькой буквы он у меня не пишется... Только с большой. Причем компайлер считает его типом AnsiString.

Так бы сразу и говорил, что используешь 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


--------------------
Да. Именно так.
PM   Вверх
mr.Anderson
Дата 5.8.2005, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Вопрос 3. smile
В вашей функции fwrite вы ничего не напутали с порядком аргументов?
Вроде, по ее прототипу сначала должен идти размер вводимых данных, а уж только затем - количество блоков текста (кстати, что это такое - блоки?). Разве должно быть не так:
Код

fwrite(text,text.size(),1,file);

А? И потом, почему у вас в коде в аргументах этой функции стоит string, когда имя переменной text? (в приведенном тут своем коде я это поправил).

Прошу ответить на все вопросы. smile
Добавлено @ 16:31
Дрон, нет, стоп! Я пишу в Билдере, но через запущенный мастер Console Wizard, т.е. в принципе никакого билдера там нет...


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
ManiaK
Дата 5.8.2005, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



Цитата(sim7 @ 5.8.2005, 17:29)
В вашей функции fwrite вы ничего не напутали с порядком аргументов?

Не знаю, я как-то экспериментировал с этими параметрами - что так, что так работает.

Цитата(sim7 @ 5.8.2005, 17:29)
Вроде, по ее прототипу сначала должен идти размер вводимых данных, а уж только затем - количество блоков текста (кстати, что это такое - блоки?).

Если так, то мой способ правильнее. Сначала идёт размер одного блока данных (в данном случае - символ, 1 байт), а потом - количество блоков (тут правда описался, test.size() должно быть smile).

Всё это работает не только в Билдере. А вот String, судя по всему, чисто билдеровский тип. В стандартной библиотеке его нет.
PM MAIL WWW   Вверх
Дрон
Дата 5.8.2005, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Цитата(sim7 @ 5.8.2005, 17:29)
Дрон, нет, стоп! Я пишу в Билдере, но через запущенный мастер Console Wizard, т.е. в принципе никакого билдера там нет...

А какие у тебя include написаны? smile

Цитата(sim7 @ 5.8.2005, 17:29)
Вроде, по ее прототипу сначала должен идти размер вводимых данных, а уж только затем - количество блоков текста

Да это не особо важно.
Это имеет смысл скорее при чтении, т.к. fread возвращает именно количество прочитанных блоков, а не байт.

Добавлено @ 16:47
Блок в данном случае -- это минимальный элемент данных. Например, если ты пишешь массив, то логично сделать так:
кол-во блоков = кол-во элементов массива
размер блока = sizeof(одного элемента массива)

Хотя от того, что ты напишешь
кол-во блоков = 1
размер блока = кол-во элементов массива * sizeof(элемента)

ничего не изменится.

Это сообщение отредактировал(а) Дрон - 5.8.2005, 16:53


--------------------
Да. Именно так.
PM   Вверх
mr.Anderson
Дата 5.8.2005, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Maniak, странно как-то получается. В заранее определенной функции можно переставлять местами аргументы?! Вот это да. smile
Дрон, вот такие у меня инклуды:
Код

#include <vcl.h>
#include <stdio.h>
#include <conio.h>
#include <string> //Это я сейчас допишу

А функцию мы используем fwrite, а не fread. smile
Добавлено @ 16:51
ManiaK, да, кстати, я пару постов назад еще два вопроса задал. Ответье на них, пожалуйста. smile

Это сообщение отредактировал(а) sim7 - 5.8.2005, 16:50


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Дрон
Дата 5.8.2005, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Цитата(sim7 @ 5.8.2005, 17:49)
#include <vcl.h>

Что и требовалось доказать smile smile

VCL -- это и есть главная библиотека Билдера, в которой определены все классы вроде AnsiString, TForm и прочих smile smile


Добавлено @ 16:53
Цитата(sim7 @ 5.8.2005, 17:23)
Вопрос 1. Разве надо писать "use"? А не "using"?
Вопрос 2. Можно ли эту строку не писать, а написать вот так:

1. Конечно using
2. Да. Только переменная называется text, а не string smile

Это сообщение отредактировал(а) Дрон - 5.8.2005, 16:54


--------------------
Да. Именно так.
PM   Вверх
mr.Anderson
Дата 5.8.2005, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



А-а-а... Она просто подрубается по умолчанию (при создании шаблона через Console Wizard она уже подключена), поэтому я ее и не вырубал - вдруг все работать перестанет? smile А ее можно не подключать?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Дрон
Дата 5.8.2005, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



sim7
Если ты её не подключишь, то у тебя не будет AnsiString smile


--------------------
Да. Именно так.
PM   Вверх
ManiaK
Дата 5.8.2005, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



Цитата
Конечно using

Отвлекаюсь, ошибки делаю smile

Цитата(sim7 @ 5.8.2005, 17:54)
А ее можно не подключать?

Для консоли можно.
Добавлено @ 16:57
Цитата
Если ты её не подключишь, то у тебя не будет AnsiString

Ну и нафиг он не нужон...
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0714 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.