Форум: Форум C++Разное
Новые темы: 00
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Запись в файл
 
 автор: bronenos   (17.01.2007 в 13:01)   письмо автору
 
 

Вот собственно проблема маленькая...
Ошибки выкидывает...
Я только три дня его изучаю но так хорошо на PHP пишу...


#include <iostream.h>
#include <stdio.h>
#include <string.h>

void main() {
 char nick[60];
 char msg[200];

 cout << "Ник:\n";
 cin >> nick;
 if (strlen(nick) < 3)
 {
  cout << "Слишком короткий ник";
 }
 else
 {
  cout << "Сообщение:\n";
  cin >> msg;
  if (strlen(msg) < 2)
  {
   cout << "Слишком короткое сообщение";
  }
  else
  {
   file *fp = fopen ('database.txt''a');
   if (!fp)
   {
    cout << "Ошибка открытия файла";
   }
   else
   {
    fputs (nick + "\t" + msg + "\n", fp);
    fclose (fp);
    cout << "\n\nСообщение записано";
   }
  }
 }
}

  Ответить  
 
 автор: cheops   (17.01.2007 в 14:46)   письмо автору
 
   для: bronenos   (17.01.2007 в 13:01)
 

1) Имена в C++ зависят от регистра, поэтому file и FILE - это разные имена. Если вы используете стандартную библиотеку для открытия файла, следует использовать FILE
2) Одиночные кавычки используются только для символов, т.е. типа char, двойные - для строк, т.е. char *. Поэтому писать 'database.txt' нельзя - только "database.txt"
3) Оператор + не реализован для строк char * - его нужно перегружать или использовать более продвинутые строки. Поэтому писать nick + "\t" + msg + "\n" - нельзя, для объединения char * строк следует использовать функцию strcat().
Т.е. в конечном итоге программа может выглядеть следующим образом
#include <iostream.h> 
#include <stdio.h> 
#include <string.h> 

void main() { 
 char nick[60]; 
 char msg[200];
 char tmp[1000];

 cout << "Ник:\n"
 cin >> nick; 
 if (strlen(nick) < 3) 
 { 
  cout << "Слишком короткий ник"
 } 
 else 
 { 
  cout << "Сообщение:\n"
  cin >> msg; 
  if (strlen(msg) < 2) 
  { 
   cout << "Слишком короткое сообщение"
  } 
  else 
  { 
   FILE *fp = fopen ("database.txt""a"); 
   if (!fp) 
   { 
    cout << "Ошибка открытия файла"
   } 
   else 
   { 
    strcat(tmp, nick);
    strcat(tmp,"\t");
    strcat(tmp,msg);
    strcat(tmp,"\n");
    fputs (tmp, fp); 
    fclose (fp); 
    cout << "\n\nСообщение записано"
   } 
  } 
 } 
}

  Ответить  
 
 автор: bronenos   (17.01.2007 в 17:35)   письмо автору
 
   для: cheops   (17.01.2007 в 14:46)
 

Насчет strcat... он пишет типа не может конвертировать char в char *.
Надо ставить char *input[] (у меня вместо tmp) ?
Все равно вроде не хочет :(
И еще...
1. значит нельзя соединять строки удобно например . или + ? весьма жаль
2. где можно найти все функции работы со строками
string файл смотрел
но там лишь объявления вроде как без описания

  Ответить  
 
 автор: ssdmt   (18.01.2007 в 15:15)   письмо автору
 
   для: bronenos   (17.01.2007 в 17:35)
 

а зачем вы ваще пишете .. на таком вот чисто ANSI C?? это же только в лабах студенческих встречается ..в жизни всё подругому ... есть и точки и плюсы :) тока надо пральные классы использовать для работы со строками .. в вашем php прежде чем . появилась ..столько было сделано за кадром!! так же и в С :)

  Ответить  
 
 автор: cheops   (18.01.2007 в 16:52)   письмо автору
 
   для: ssdmt   (18.01.2007 в 15:15)
 

На чистом C не мало вещей создано и поддерживается - тот же Linux например, разнообразные сервера (Apache, MySQL)... Кроме того, используя готовые классы всех аспектов языка понять невозможно. Разумеется если за пол года требуется создать систему документооборота необходимо использовать готовые библиотеки на полную катушку (с ними бы успеть, не говоря уж о каких-то своих разработках). Однако если человек обучается, библиотеки будут мешать - С++ и без библиотек достаточно большой и сложный, чтобы их приплетать на ранних этапах обучения.

  Ответить  
 
 автор: bronenos   (18.01.2007 в 21:51)   письмо автору
 
   для: cheops   (18.01.2007 в 16:52)
 

О господи
Тут есть смайл обморока? :)
Что значит на ANSI?
Какой учебник - такой и я :)
+ эт... что значит без библиотек?
а iostream для общения с пользователем?
а stdio для файлов?
а string для работы со строками и использования string типа?
И если есть и точки и плюсы, то как же ими наконец воспользоваться спокойно?? )))

Тут передо мной словно С+++ наконец-то открывают :)

  Ответить  
 
 автор: bronenos   (17.01.2007 в 17:36)   письмо автору
 
   для: cheops   (17.01.2007 в 14:46)
 

Насчет strcat... он пишет типа не может конвертировать char в char *.
Надо ставить char *input[] (у меня вместо tmp) ?
Все равно вроде не хочет :(
И еще...
1. значит нельзя соединять строки удобно например . или + ? весьма жаль
2. где можно найти все функции работы со строками
string файл смотрел
но там лишь объявления вроде как без описания

  Ответить  
 
 автор: Фитч   (17.01.2007 в 18:10)   письмо автору
 
   для: bronenos   (17.01.2007 в 17:36)
 

В файле string.h объявлен класс String и оператор + для него. Т.е. если надо соединить две строки, то это будет так:

#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

int main(int argc,char* argv[])
{
 String nic, msg;
 cin>>nic;
 cin>>msg;
 
 String tmp = nic + " \t "+msg+"\r\n";

 /* ну и так далее */
}

  Ответить  
 
 автор: cheops   (17.01.2007 в 18:17)   письмо автору
 
   для: Фитч   (17.01.2007 в 18:10)
 

Причём если вам вдруг понадобиться конвертировать string-строку в char можно использовать метод c_str()
  cout << tmp.c_str() << endl;

  Ответить  
 
 автор: bronenos   (17.01.2007 в 18:22)   письмо автору
 
   для: Фитч   (17.01.2007 в 18:10)
 

1. что такое <cstdlib> и зачем у вас в программе
2. выходит что для String не надо создавать массивы?
и эт... тут тоже регистр важен или надо
typedef String string

  Ответить  
 
 автор: cheops   (17.01.2007 в 18:32)   письмо автору
 
   для: bronenos   (17.01.2007 в 18:22)
 

По стандарту следует использовать string, однако различные библиотеки часто реализуют свои строки и называют их немного по другому CString, String, AnsiString и т.п. string - это класс, который должен реализовывать любой c++ компилятор.

  Ответить  
 
 автор: bronenos   (17.01.2007 в 18:40)   письмо автору
 
   для: cheops   (17.01.2007 в 18:32)
 

Так, я немного запутался... вы говорите что можно использовать string и что он существует
но ведь во всех учебниках используется только char массивы для хранения строк...

  Ответить  
 
 автор: cheops   (17.01.2007 в 18:46)   письмо автору
 
   для: bronenos   (17.01.2007 в 18:40)
 

Формально string - это класс стандартной библиотеки шаблонов STL, шаблоны и стандартная библиотека традиционно рассматриваются в самых последних главах (если вообще рассматриваются), так как шаблоны и STL не самый простой вопрос в C++ - их лучше рассматривать уже хорошо ориентируясь в базовых основах C++.

PS Вы каким учебником пользуетесь?

  Ответить  
 
 автор: bronenos   (17.01.2007 в 18:56)   письмо автору
 
   для: cheops   (17.01.2007 в 18:46)
 

Ишкова
С++ НАЧАЛА ПРОГРАММИРОВАНИЯ
третье издание

  Ответить  
 
 автор: cheops   (17.01.2007 в 18:14)   письмо автору
 
   для: bronenos   (17.01.2007 в 17:36)
 

>Надо ставить char *input[] (у меня вместо tmp) ?
Нет, вы должны использовать строку, т.е. указатель на char. Когда вы пишите char *input[] - это эквивалентно двойному указателю char **input. Кроме того, если вы не выделяете память при объявлении char input[1000] или затем динамически не выделяется память при помощи new - запись производится прямо по тексту программы (что в большинстве случаев заканчивается ошибкой). Прибавляя при помощи фукнции strcat() второй аргумент к первому, вы должны быть уверенными, что под первый аргумент выделено достаточно памяти.

>1. значит нельзя соединять строки удобно например . или + ? весьма жаль
+ можно использовать, но с более сложными реализациями строк, например с классом string из стандартной библиотеки.
>2. где можно найти все функции работы со строками
такого справочника (бесплатного, удобного и на русском) вроде как нет... мы сейчас раздумываем не начать ли его создавать как в OnLine-варианте, так и в CHM-формате, чтобы любой желающий мог его скачать и использовать. В бумажном варианте можно посоветовать "Полный справочник по C++" Г.Шилдта.

  Ответить  
 
 автор: bronenos   (17.01.2007 в 18:36)   письмо автору
 
   для: cheops   (17.01.2007 в 18:14)
 

тогда получается что можно типа этого

String nick, msg, input;
cin >> nick >> msg;
input = nick + "\t" + msg + "\n";

fputs (input.c_str(), fp);

зы:
я в учебнике этой фразы не вижу, а тут постоянно ее вижу
она обязательна для cout?
using namespace std

  Ответить  
 
 автор: cheops   (17.01.2007 в 18:43)   письмо автору
 
   для: bronenos   (17.01.2007 в 18:36)
 

Не уверен, что оператор >> для объекта cin перегружен для заполнения объектов string.

>я в учебнике этой фразы не вижу, а тут постоянно ее вижу
>она обязательна для cout?
>using namespace std
Для последних версий С++, да, следует указывать пространство имён или предварять каждое имя из стандартной библиотеки префиксом std::, например
std::cin >> nick >> msg;

если вы предваряете стандартные идентификаторы std::, можно не указывать, что вы используете стандартное пространство имён при помощи using namespace std.

PS Вы каким компилятором пользуетесь?

  Ответить  
 
 автор: bronenos   (17.01.2007 в 18:54)   письмо автору
 
   для: cheops   (17.01.2007 в 18:43)
 

Не могу сказать так как сегодня друг говорил что какой то новой принесет так что не знаю еще...
значит если я присваиваю string переменной значение и потом вывожу на экран или в файл или еще что то то надо сначала в char?

  Ответить  
 
 автор: cheops   (17.01.2007 в 19:06)   письмо автору
 
   для: bronenos   (17.01.2007 в 18:54)
 

Да, проще всего поступить так
#include <iostream.h> 
#include <stdio.h> 
#include <string.h> 

void main() { 
 char nick[60]; 
 char msg[200];

 cout << "Ник:\n"
 cin >> nick; 
 if (strlen(nick) < 3) 
 { 
  cout << "Слишком короткий ник"
 } 
 else 
 { 
  cout << "Сообщение:\n"
  cin >> msg; 
  if (strlen(msg) < 2) 
  { 
   cout << "Слишком короткое сообщение"
  } 
  else 
  { 
   FILE *fp = fopen ("database.txt""a"); 
   if (!fp) 
   { 
    cout << "Ошибка открытия файла"
   } 
   else 
   { 
    string tmp = "";

    tmp += string(nick) + "\t" + msg + "\n";
    fputs (tmp.c_str(), fp); 
    fclose (fp); 
    cout << "\n\nСообщение записано"
   } 
  } 
 }
}

  Ответить  
 
 автор: bronenos   (17.01.2007 в 19:18)   письмо автору
 
   для: bronenos   (17.01.2007 в 18:54)
 

Вот собственно файл тут в любой момент:
http://phx.freedomf.net/set/b_chat.cpp

  Ответить  
 
 автор: bronenos   (17.01.2007 в 22:14)   письмо автору
 
   для: bronenos   (17.01.2007 в 19:18)
 

Да, и текущий компилятор Borland C

  Ответить  
 
 автор: bronenos   (17.01.2007 в 22:15)   письмо автору
 
   для: bronenos   (17.01.2007 в 22:14)
 

А у вас тут какой?
И где скачать можно?

  Ответить  
 
 автор: cheops   (17.01.2007 в 22:39)   письмо автору
 
   для: bronenos   (17.01.2007 в 22:15)
 

Да, собственно любой можно использовать, я для быстрого тестирования использую Borland C++ 5.6 в командной строке, очень неплоха для изучения языка бесплатная среда разработки Dev-C++, использующая в качестве компилятора Windows-порт легендарного UNIX-компилятора gcc. Доступен C++ Builder 6 (Borland C++ 5.6 как раз в его состав входит), а также VC++ .NET 2003. В принципе если придерживаться стандарта и не использовать уникальные библиотеки, то код должен компилироваться каждым из этих компиляторов без вопросов.

  Ответить  
 
 автор: bronenos   (17.01.2007 в 22:45)   письмо автору
 
   для: cheops   (17.01.2007 в 22:39)
 

Вот по ссылке которую я дал, опять что-то не понял и опять сделал как лопата или компилятор просто не понимает string?
Именно на эту строчку в числе некоторых других он и ругается... :(

  Ответить  
 
 автор: cheops   (17.01.2007 в 22:50)   письмо автору
 
   для: bronenos   (17.01.2007 в 22:45)
 

Всё что заключается в двойные кавычки является уже строкой, если требуется лишь один символ - его следует заключать в одиночные кавычки. Поэтому 40 строку файла следует заменить на
    if (ltr=='<' || ltr=='>' || ltr=='+' || ltr=='?') {

  Ответить  
 
 автор: bronenos   (18.01.2007 в 08:39)   письмо автору
 
   для: cheops   (17.01.2007 в 22:50)
 

Одиночный символ в ' ?
А если одиночный символ у меня например и есть ' ?
if (ltr != ''') запись абсурдная \' на ее месте наверное будет уже спецсимволом ..

  Ответить  
 
 автор: cheops   (18.01.2007 в 13:37)   письмо автору
 
   для: bronenos   (18.01.2007 в 08:39)
 

Используется
'\''

  Ответить  
 
 автор: bronenos   (18.01.2007 в 20:16)   письмо автору
 
   для: cheops   (18.01.2007 в 13:37)
 

Эм... еще вот вопросик...
Какие функции в С++ аналогичны str_replace() и list() в PHP?
Если таковые имеются конечно...

  Ответить  
 
 автор: cheops   (18.01.2007 в 22:35)   письмо автору
 
   для: bronenos   (18.01.2007 в 20:16)
 

>str_replace()
В чистом C нет - нужно STL юзать...
>list()
Нет - это Perl-овое изобретение и в PHP оно из Perl попало... C++ строготипизированный язык, здесь такие конструкции не очень покатят... воспринимайте C как сверх-скоростной язык, не удоством по сравнению с современными языками программирования вы расплачиваетесь за его высокую эффективность... нет на сегодняшний момент промышленных сред, которые бы производили бы код с большей эффективностью (Assembler - не промышленная среда, да и код высокой эффективности (эффективнее чем современный C-компилятор) на нём изготовить очень сложно)...

PS Под новые вопросы лучше заводить новые темы...

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования