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

Поиск:

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


Homo Sapience
***


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

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



Вот этот код:
Код

char y;    
puts("Enter your text. End - symbol ~ (til'da)");    
while((y=getch())!='~') {};// ОШИБКА - БЕСКОНЕЧНЫЙ ЦИКЛ!!    
if(y=='~') fprintf(y,file);// ЭТО - ВНЕ ТЕЛА ЦИКЛА!!! (да и вообще ерунда)


Заменить на этот:

Код

char y;    
puts("Enter your text. End - symbol ~ (til'da)");    
while((y=getche())!='~') fprintf(file, "%c", y);


Тогда и символы вводимые будут отображаться и закончится ввод на тильде.
PM MAIL WWW   Вверх
mr.Anderson
Дата 5.8.2005, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Спасибо! Пойду пробовать. Сейчас отпишу, что получится.
Добавлено @ 18:15
Отлично! Maniak, полный порядок. Ваш код вполне сработал. Осталось только придать ему "красоты". smile
Спасибо большое всем, кто мне тут помогал. Просто огромное спасибо.
И еще: несмотря на то, что я использовал код без класса string, все равно его изучение в этой теме для меня лишним не было. smile


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

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


iOS Lead Developer
****


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

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



Так. Стоп-с. Одна проблема. Enter вводить нельзя. Почему-то. Когда его нажимаешь, то указатель курсора в консоли становится на начало строки, и весь текст просто перетирается (переписывается) новыми буквами, которые я потом ввожу. Кстати, когда нажимаешь Backspace, то указатель тоже просто перемещается на 1 позицию назад, и при последующем вводе букв опять-таки просто "перетирает" символы. Как поправить?


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

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


iOS Lead Developer
****


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

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



Что, устали отвечать? А как тут все бойко шло час назад... Эх... smile
Но эту проблему я сам решил. Если у кого еще будет такой вопрос, то надо просто подставить в код проверку на нажатие энтера вот таким вот кодом:
Код

char x;
if((x=getche())==13) printf("\n");

Вот и все! Теперь ваши консольные приложения будут вполне адекватно обрабатывать нажатие клавиши Enter.


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

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


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 2
Всего: 18



Забой не работает тк ты читаешь каждый символ по отдельности из буфера и забираешь его. Потому ты не можешь удалить последний введенный символ из буфера тк его там уже нет. smile

С ентером прикольно получилось.
PM MAIL ICQ   Вверх
mr.Anderson
Дата 5.8.2005, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Нравится? Сам радуюсь. smile
Теперь еще задача. Тоже с использованием типа string, наверное, поэтому, ув. модераторы, это не оффтопик. smile
Задача такая. Пользователь вводит (опять же, в консоли) путь к файлу (естественно, в путь включено и имя). И вот надо открыть файл по указанному пути и обработать его.
Я попробовал так:
Код

#include <string>
#include <stdio.h>
#include <conio.h>
void rebuild_source_file(std::string file_name)
{
 FILE *c_file;
 if((c_file=fopen(file_name,"r"))==NULL)
 {
  printf("Fatal error: Can't open file!\n\nProgram aborted. Press any key...");
  getch();
  abort();
 }
 else
 {
  int x;
  while((x==getc(c_file))!=EOF)
  {
  printf("This text was founded in your file:\n%c",x);
  }
 }
}

Но компайлер ругается, что в прототипе функции fopen нет места переменным типа string. Так как же решить эту задачу?

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


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

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


Homo Sapience
***


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

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



Приведением к типу char*, уже писали сто раз.

Код

#include <string>    
#include <stdio.h>    
#include <conio.h>    
void rebuild_source_file(std::string file_name)    
{    
 FILE *c_file;    
 if((c_file=fopen(file_name.c_str(),"r"))==NULL)// Вот здесь!!! <<--------    
 {    
  printf("Fatal error: Can't open file!\n\nProgram aborted. Press any key...");    
  getch();    
  abort();    
 }    
 else    
 {    
  int x;    
  while((x==getc(c_file))!=EOF)    
  {    
  printf("This text was founded in your file:\n%c",x);    
  }    
 }    
}


Открой любой справочник по STL и найди там string. Не стоит засорять данный форум подобными вопросами. Я подниму вопрос по созданию чего-нибудь вроде школьного форума по Си++ раз такое дело получается, но вообще гораздо выгоднее дойти до технического решения самому - проще потом будет.
PM MAIL WWW   Вверх
mr.Anderson
Дата 5.8.2005, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Это понятно, но я бы, конечно, не догадался так сделать. Спасибо! Сейчас буду пробовать.


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

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


iOS Lead Developer
****


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

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



Программа-то скомпайлилась, но не так работает, как надо. Что бы я в консольном окне не написал, прога все равно пишет, что не может открыть файл... Код-то верный, может, я что не так набираю? Как надо писать имя файла в консоли? Пример приведите.
Если надо, вот код:
Код

void rebuild_source_file(std::string file_name)
{
 FILE *c_file;
 if((c_file=fopen(file_name.c_str(),"r"))==NULL)
 {
  printf("Fatal error: Can't open file!\n\nProgram aborted. Press any key...");
  getch();
  abort();
 }
 else
 {
  int x;
  while((x==getc(c_file))!=EOF)
  {
  printf("This text was founded in your file:\n%c",x);
  }
 }
}



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

user posted image
PM MAIL ICQ Skype   Вверх
Guest
Дата 6.8.2005, 10:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата

Как надо писать имя файла в консоли?

Как и в gui. Если не работает, значит считываешь имя файла не так(если считываешь посимвольно, то проверь чтобы в имя файла не попадали символы быкспейса и ентера). В конце концов выведи file_name на экран/посмотри в отладчике.

и еще -
while((x==getc(c_file))!=EOF)
заменить на
while((x=getc(c_file))!=EOF).
Кстати, а компилер не ругается?

ЗЫ. Если указываешь имя файла в коде, то не забывай удваивать все \ знаки - то есть rebuild rebuild_source_file("c:\\autoexec.bat")

ЗЫЫ. Ой нафлудили smile
  Вверх
Guest
Дата 6.8.2005, 10:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











(Guest это был Mayk)
Ну чтобы эта мессага не совсем флуд была, то выскажу еще свое имхо, что смешивать С++ с С нехорошо. В плюсах есть удобные fstream для файлов.
И еще -
Цитата

Код

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


вместо gets стоит использовать fgets
Код

char str[256];
fgets(str,256,stdin);
fputs(str, file);

  Вверх
Fixin
Дата 6.8.2005, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 2
Всего: 18



Код
fopen(file_name.c_str(),"r"))
Надо так:
Код
fopen(file_name.c_str(),"rb"))
Только не помню, как конец файла тогда ловить.


PM MAIL ICQ   Вверх
Mayk
Дата 6.8.2005, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

Репутация: 45
Всего: 134



Цитата(Fixin)

Только не помню, как конец файла тогда ловить.

Да так же - константа EOF, которую возвращает fgetc при конце файла, равна -1(0xFFFFFFFF), в то время как размер char'а ограничен одним байтом(0xFF максимум). Ну двумя, если мы о wchar_t будем говорить.
Поэтому fgetc'у нет принципиальной разницы, бинарен файл, или нет. Плюс еще feof(FILE* stream) есть. Только из контекста я понял, что файл как раз текстовой, а не бинарный.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
En_t_end
Дата 6.8.2005, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 1
Всего: 20



sim7
Маленькое замечание.
Двойные кавычки в контексте C++ в большинстве случаев используются для обозначение строки. "\n" - хоть ошибкой и не является, но в некоторых местах программы это может сбить с толку читающего программу.
PM MAIL ICQ Skype GTalk Jabber   Вверх
mr.Anderson
Дата 6.8.2005, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Да, файл текстовый.
А про двойные кавычки - это о чем? Где я их вместо одинарных использовал? Что-то не найду никак...
И я еще раз повторюсь. Прога вообще не воспринимает имя файла.
В консоли пишу:
Цитата
newtext.txt

По коду после этого ввода запускается описанная выше функция rebuild_source_file(std::string file_name) с новым значением. Файл newtext.txt расположен в директории самой программы, поэтому нет смысла указывать путь. Однако, выдается Fatal Error (по моему коду это тогда, когда файл нельзя открыть). Так в чем же дело-то?!


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

user posted image
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0612 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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