Модераторы: 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   Вверх
mr.Anderson
Дата 5.8.2005, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



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

А он вообще нужен? smile
Maniak, написал вот это:
Код

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

Пишет ошибку:
Цитата
E2285 Could not find a match for 'fwrite(string,int,unsigned int,FILE *)';

Что такое?

И еще: как в объявленную переменную text загнать текст, введенный пользователем в консоли?


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

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


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


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

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



Уфф... Люди вы что, с Луны свалились? smile

Пиши
Код

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




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


Homo Sapience
***


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

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



Цитата
Уфф... Люди вы что, с Луны свалились?

Всё нормально, я эту ветку в закладки брошу - чуть что, сразу пошлю сюда smile
PM MAIL WWW   Вверх
Дрон
Дата 5.8.2005, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(sim7 @ 5.8.2005, 18:01)

И еще: как в объявленную переменную text загнать текст, введенный пользователем в консоли?

Во-первых
Код

#include <iosteam>

Во-вторых
Код

std::cin >> text;




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


iOS Lead Developer
****


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

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



Дрон, а как же тип string?


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

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


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


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

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



Цитата(sim7 @ 5.8.2005, 18:06)
Дрон, а как же тип string?

Э-э-э... А что с ним не так?


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


iOS Lead Developer
****


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

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



Про загон понял, а все же, тип string куда девать? Как с ним сделать (уж очень с ним хочется smile )?


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

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


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


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

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



sim7
Так я ж его и использовал.

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


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


Ёжик
***


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

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



Цитата
Пишет ошибку:

Цитата 
E2285 Could not find a match for 'fwrite(string,int,unsigned int,FILE *)';


Что такое?
Нужно
Код
#include <stdio.h>

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


iOS Lead Developer
****


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

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



И еще: #include <iostream> и #include <iostream.h> эквивалентны или нет?
Про тип string - я имею в виду, ваша строчка отличается от той, что Maniak указал. Приведите весь фрагмент моего кода (который я в 1-м посте дал) в переделанной форме.


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

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


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


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

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



Fixin
Уже есть. Просто fwrite первым параметром принимает void*


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


iOS Lead Developer
****


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

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



А как же тогда? В общем, приведите весь код в целости (см предыдущий мой пост).


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

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


Ёжик
***


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

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



Да быстро очень... не успеваю smile
PM MAIL ICQ   Вверх
Дрон
Дата 5.8.2005, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(sim7 @ 5.8.2005, 18:09)
И еще: #include <iostream> и #include <iostream.h> эквивалентны или нет?

Почти. Для iostream.h не надо приставки std:: перед cin. Просто в VS7, где я пишу есть только iostream

Код

void save_how_much(void)
{
 FILE *file;
 if((file=fopen("howmuch.txt","wb"))==NULL)
 {
  std::cout << "Fatal error: Can't open file to write!\n\nProgram aborted. Press any key...";
  getch();
  abort();
 }
 else
 {
  std::cout << "Enter your text.\n";

  std::string text; 

  std::cin >> text;
  fwrite(text.c_str(), 1, text.size(), file);

  fclose(file);
 }
}


И кстати, если уж используем cin, то логичней вместо puts использовать cout.

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


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


Ёжик
***


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

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



Код
#include <string>
#include <stdio.h>
#include <iostream.h>

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

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


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


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

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



Fixin
У тебя тоже string вместо text

ЗЫ: Я от этой темы помру со смеху...

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


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


iOS Lead Developer
****


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

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



А зачем? Разве есть разница, если надо вывести просто текст?
И еще вопрос. Если используется cin, то, значит, текст будет принят после нажатия Enter. А мне это не нужно. Ведь прога должна считать еще и количество переводов строки. Как это обеспечить?


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

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


Ёжик
***


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

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



Цитата
И кстати, если уж используем cin, то логичней вместо puts использовать cout.

Ну если
Код
#include <iostream.h>
, то зачем
Код
FILE *file;
?
PM MAIL ICQ   Вверх
Дрон
Дата 5.8.2005, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(sim7 @ 5.8.2005, 18:15)
А зачем? Разве есть разница, если надо вывести просто текст?

Для единообразия.

Цитата(sim7 @ 5.8.2005, 18:15)
И еще вопрос. Если используется cin, то, значит, текст будет принят после нажатия Enter. А мне это не нужно. Ведь прога должна считать еще и количество переводов строки. Как это обеспечить?

А таких функций нет. Придумывай сам.
И, кстати, а чем тогда окончание ввода будет обозначаться?


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


iOS Lead Developer
****


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

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



Fixin, как это? Объявлять указатель на файл надо (это я по учебнику делал). Иначе с файлом оперировать не получится...


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

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


Homo Sapience
***


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

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



Дрон не флеймим smile И так уже нахулиганили...

Цитата(sim7 @ 5.8.2005, 18:15)
Ведь прога должна считать еще и количество переводов строки. Как это обеспечить?

Зациклить. Что-то вроде:
Код

string text, str;
for(i = 0; i < [Нужное кол-во строк]; i++) { cin >> str; text += str; }

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


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


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

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



sim7
Цитата(sim7 @ 5.8.2005, 18:17)
Fixin, как это? Объявлять указатель на файл надо (это я по учебнику делал). Иначе с файлом оперировать не получится...

Он имеет ввиду, что надо использовать функции из iostream, а не из stdio...

Но ты забудь... Не забивай голову smile smile smile

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


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


iOS Lead Developer
****


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

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



Да елки! Никогда не успеваю ответить до другого участника! Здорово! smile smile
Дрон, ну, предположим, будет символ ~ (тильда). Я просто не представляю, как увязать cout и символ конца ввода...


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

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


Ёжик
***


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

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



Цитата
ЗЫ: Я от этой темы помру со смеху...
Да уж.
Код
void save_how_much(void)
{
 ofstream out ("howmuch.txt");
 cout << "Enter your text.\n";
 std::string text; 
 std::cin >> text;
 out << text.c_str(); //tut ne uveren
 out.close();
}

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


iOS Lead Developer
****


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

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



Ешкин кот! Опять не успел! smile
Maniak, но тогда ведь придется пользователю вводить текст посимвольно. Т.е. символ-энтер, символ-энтер и т.д. Я пробовал этот вариант, но он же неверный в данной задаче.


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

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


Homo Sapience
***


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

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



Цитата(sim7 @ 5.8.2005, 18:18)
Я просто не представляю, как увязать cout и символ конца ввода...

Никак. Тут можно так сделать (с тильдой):
Код

char ch; string str;
while((ch = getch()) != '~') str += ch;

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


Ёжик
***


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

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



Цитата
Если используется cin, то, значит, текст будет принят после нажатия Enter. А мне это не нужно. Ведь прога должна считать еще и количество переводов строки. Как это обеспечить?
Это посимвольный ввод нужен... муторно.
PM MAIL ICQ   Вверх
Дрон
Дата 5.8.2005, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



sim7
Я бы всё сделал вообще по-другому...

Код

char buffer[1024];
char *ptr = buffer;
int ch;

while ( (ch = getche()) != 27) // 27 - код клавиши ESC
{
   *ptr = (char)ch;
   ptr++;
   if(ptr-buffer == 1024) break;
};

fwrite(buffer, 1, ptr-buffer, file);

Ввод закончится либо после 1024 символов, либо по нажатию ESC


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


iOS Lead Developer
****


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

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



Ну, тогда ведь и получится, как я сказал, Maniak. А вводить текст побуквенно не совсем реально, по-моему. smile


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

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


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


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

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



Fixin
Цитата(Fixin @ 5.8.2005, 18:22)
Это посимвольный ввод нужен... муторно.

Ну не очень... smile smile

ЗЫ: Хочу на этой теме до 1000 постов дойти smile


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


Ёжик
***


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

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



Цитата
Ну, тогда ведь и получится, как я сказал
Все нормально!
PM MAIL ICQ   Вверх
ManiaK
Дата 5.8.2005, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


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

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



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


iOS Lead Developer
****


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

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



Дрон, интересное предложение... Можете объяснить свой код? А то я не совсем въехал... С указателями всегда путался...


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

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


Ёжик
***


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

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



Цитата
ЗЫ: Хочу на этой теме до 1000 постов дойти
За ЧАС!!!!
PM MAIL ICQ   Вверх
mr.Anderson
Дата 5.8.2005, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Maniak, у меня вообще при использовании getch() в консоли текст не вводится. Нажимаю клавиши, и никакой реакции. Я тоже хотел изначально такой способ использовать.


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

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


Homo Sapience
***


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

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



Дрон, Fixin угомонитесь smile Это не флейм.
PM MAIL WWW   Вверх
Fixin
Дата 5.8.2005, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


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

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



Цитата
Можете объяснить свой код
А там просто из буфера читается, в этом и весь прикол smile
Добавлено @ 17:26
Цитата
меня вообще при использовании getch() в консоли текст не вводится
Вообще?
PM MAIL ICQ   Вверх
mr.Anderson
Дата 5.8.2005, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Я ж попросил объяснить, Fixin. smile Я не понимаю, что там происходит в каждой строчке кода. А смысл мне понятен.
Добавлено @ 17:27
Цитата
Вообще?

Абсолютно, за исключением энтеров.


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

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


Homo Sapience
***


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

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



Модератор: если это продолжится - приму меры!

Цитата(sim7 @ 5.8.2005, 18:25)
у меня вообще при использовании getch() в консоли текст не вводится. Нажимаю клавиши, и никакой реакции. Я тоже хотел изначально такой способ использовать.

Код пожалуйста в студию.
PM MAIL WWW   Вверх
Дрон
Дата 5.8.2005, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

char buffer[1024]; // выделим буфер на 1024 байта
char *ptr = buffer; // указатель установим на начало буфера
int ch; // переменная с кодом нажатой клавиши
while ( (ch = getche()) != 27) // присваиваем ch - код клавиши, выводим её на экран и сразу сравнимаем с ESC
{
   *ptr = (char)ch; // устанавливаем значение в том байте, на который указывает ptr
   ptr++; // сдвигаем указатель на 1 байт вперёд
   if(ptr-buffer == 1024) break; // проверяем а не прошли ли мы уже 1024 байта
};
fwrite(buffer, 1, ptr-buffer, file); // сохраняем в файл содержимое буфера
fclose(file); // закрываем файл


Этот код надо вставить за место всего того, что у тебя в блоке else.


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


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


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

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



Цитата(sim7 @ 5.8.2005, 18:25)
Maniak, у меня вообще при использовании getch() в консоли текст не вводится. Нажимаю клавиши, и никакой реакции. Я тоже хотел изначально такой способ использовать.

Если присмотреться, то у меня используется getche, которая выводит символ на экран.


// offtop
Цитата(Fixin @ 5.8.2005, 18:24)
За ЧАС!!!!

Я имел ввиду свою 1000 smile
Вот уже и 1 пост остался.

ManiaK
Сорри. Меня просто от этой темы изначально расплющило...


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


iOS Lead Developer
****


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

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



Ах, да. Ну, пробовал вот так вот:
Код

char y;
puts("Enter your text. End - symbol ~ (til'da)");
while((y=getch())!='~') {};
if(y=='~') fprintf(y,file);



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

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


Ёжик
***


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

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



Цитата
Код
fprintf(y,file);
Это как? А где формат.
2 ManiaKИзвини, не понял вопроса smile
PM MAIL ICQ   Вверх
mr.Anderson
Дата 5.8.2005, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Fixin, а я-то думаю, чего у меня она не работала... Укажите ее прототип, плиз.


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

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


Ёжик
***


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

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



Вот формат:
Код
fprintf(FILE* fp, const char* format, ..., [arguments]);

В твоем примере нужно так:
Код
fprintf(file, "%c", y);

Буква "f" перед этой функцией обозначает форматный вывод. Про формат читай справку, должно быть smile

Это сообщение отредактировал(а) Fixin - 5.8.2005, 17:54
PM MAIL ICQ   Вверх
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   Вверх
Fixin
Дата 6.8.2005, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


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

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



Измени код
Код
printf("Fatal error: Can't open file!\n\nProgram aborted. Press any key...");
На
Код
printf("Fatal error: Can't open file %s!\n\nProgram aborted. Press any key...", file_name.c_str());

Добавлено @ 20:14
И посмотри, что напишет.
PM MAIL ICQ   Вверх
mr.Anderson
Дата 7.8.2005, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Ладно, сейчас попробую.


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

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


iOS Lead Developer
****


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

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



Я для верности вставил имя файла в кавычки, так он нарисовал в этих кавычках квадратик, а затем несколько пробелов, общая длина которых равна длине имени файла! А вы сами попробуйте! Вот мой полный код:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#include <conio.h>
#include <string>
using namespace std;

//---------------------------------------------------------------------------
#pragma hdrstop
#pragma argsused
//---------------------------------------------------------------------------

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

Имя файла у меня "text.txt". Я его изначально создал в директории программы и попытался открыть. Ноль внимания (в смысле, ошибка).

И еще вопрос. Почему, когда я переменную file_name заранее переделал в строковый тип вот так:
Код

file_name=file_name.c_str();

Чтобы потом не забывать это писать и не ошибаться, компайлер снова заорал, что в fopen не может быть типа char (!)?


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

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


λcat.lolcat
****


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

Репутация: 40
Всего: 173



sim7
Давайте уже определяться, что мы используем - сишные строки и stdio или std::string и iostreams. Потому что одно с другим плохо сочетается.
Код
scanf("%s",&name_of_file);

Вот за это люди и не любят stdio. Компилятор молча пропустил грубейшую ошибку: если в строке формата стоит %s, то в качестве параметра должен быть char*, ссылающийся на буфер достаточной длины. А мы что передали? Правильно, указатель на объект типа std::string. Что у нас получилось? Правильно, undefined behaviour и вообще повезло, что все сразу не упало.

Код
while((x==getc(c_file))!=EOF)

Это попытка избежать варнинга? Неудачная, потому что в данном случае надо именно:
Код
while((x = getc(c_file)) != EOF)



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
mr.Anderson
Дата 7.8.2005, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Цитата
или std::string и iostreams.

А как с ними делать надо? Перепишите мой код по новой...
Цитата
А мы что передали? Правильно, указатель на объект типа std::string.

А как же надо? Ведь имя файла не может быть типа char, он же хранит 1 символ...
Цитата
while((x=getc(c_file)) != EOF)

Вот это действительно моя ошибка.

В общем, перепишите мой код со string. А тоя так до след. года биться буду. smile


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

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


iOS Lead Developer
****


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

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



УРА!!! smile Все заработало! smile smile Немного код переправил. Спасибо всем за советы! Вот новый код:
Код

void rebuild_source_file(string file_name);
void main(void)
{
 string name_of_file;
 cout<<"Enter name of file: "; cin>>name_of_file;
 rebuild_source_file(name_of_file);
}
void rebuild_source_file(string file_name)
{
 FILE *c_file;
 if((c_file=fopen(file_name.c_str(),"r"))==NULL)
 {
  cout<<"Fatal error: Can't open file"<<file_name.c_str()<<"!\n\nProgram aborted. Press any key...";
  getch();
  abort();
 }
 else
 {
  int x;
  cout<<"This text was founded in your file:\n";
  while((x=getc(c_file))!=EOF) cout<<x;
  cout<<"\n\nPress any key...";
  getch();
 }
}

Однако, осталась проблема. В файле text.txt, который я открываю через эту программу, находится текст:
Цитата
TEXT

Но программа, выводя содержимое файла через инструкцию else в функции перестройки файла в моем коде, выводит какие-то цифры:
Цитата
This text was founded in your file:
84698884

Press any key...

Почему так и как это исправить?


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

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


iOS Lead Developer
****


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

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



Люди! Я вопрос задал! Почему читается не текст, а цифры (см. пред. пост)?! Помогите!


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

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


λcat.lolcat
****


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

Репутация: 40
Всего: 173



sim7
Очень просто - x имеет тип int - целое число. И в cout выводится в соответствующем виде. Можно сделать вот так:
cout << char(x);
Или вовсе перейти полностью на потоки:
Код
void rebuild_source_file(const std::string &file_name) {
    std::ifstream ifs(file_name.c_str());
    if (!ifs) {
        std::cout << "Can't open file " << file_name;
    } else {
        char c;
        std::cout << "This text was found in file:\n";
        while (!ifs.eof()) {
            ifs >> c;
            std::cout << c;
        }
    }
}

std::string умеет сам выводиться в поток, поэтому писать cout << s.c_str() бессмысленно.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
mr.Anderson
Дата 8.8.2005, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Спасибо, разобрался. Действительно, дело было в типе. Я объявил ее как int, потому что в учебнике было написано:
Цитата
Переменные типа char слишком малы, чтобы хранить значение константы EOF при чтении данных из файла, поэтому в нашем примере мы объявляем тип int...



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

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


λ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
PM MAIL WWW GTalk   Вверх
mr.Anderson
Дата 8.8.2005, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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



Ну, надо же. А я уж было собрался в учебнике править... smile


--------------------
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.1442 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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