C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Простой вопрос чайника. Heeeeeelp!!!!, Полтергейс какой то.
Aladdin
Отправлено: 10.11.2003, 13:22


Не зарегистрирован







Есть такая функция которая читает строку из файла (123.txt):

char *str()
{ char str[100];
ifstream fi(123.txt);
fi.getline(str,100,'\n');
fi.close();
returne str;
}
Из другой функции я вызываю функцию str() и записываю полученную
строку в другой файл (321.txt);

ofstream out(321.txt);
out< в выходном файле получаю ПОЛНЫЙ БРЕД (крякозябры)
для проверки функции пишу :

Edit1->Text= str();
ВСЕ ОК-ОБ smile.gif

PS: Памажите плз. а то у меня уже мозги закипают :-(
Roman
Отправлено: 10.11.2003, 14:08


Дежурный стрелочник

Группа: Участник
Сообщений: 78



Может дело в кодировке? Edit1->Text кодировка 1251 (Win), а в файл может идти другая (DOS — 866). Каким способом открываешь файл для записи?
Guest
Отправлено: 10.11.2003, 15:55


Не зарегистрирован







Не дело не в кодировке. Иногда в выходном файле вместе
с крякозябрами проскакивали куски моего текса.
Здесь я чет напутал с вызовом функции.

Ну а файл вроде по книжке открывал

библиотеки: fstream, iostream
А вот, я спешил и недописал
ofstream out(321.txt);
out<< str();
Nick
Отправлено: 10.11.2003, 17:56


Машинист паровоза

Группа: Участник
Сообщений: 247



может дело в том что str (буфер чтения)
объявлен внутри функции и после выполнения удаляется из памяти.
Попробуй объявитьее вне функции (и с другим именем,здесь наверно тоже спешил).
Admin
Отправлено: 10.11.2003, 18:06


Владимир

Группа: Администратор
Сообщений: 1190



А что, у вас функция и массив имеют одинаковое название — str ?

Попробуйте такде сначала очистить массив.

CODE

char *Mystr()
{
static char str[100];
for(int i=0; i<100; i++) str[i] = 0;
...


и нет кода как вы записывете в файл эту полученную строку,
особенно если

QUOTE
для проверки функции пишу :

Edit1->Text= str();
ВСЕ ОК-ОБ
Георгий
Отправлено: 10.11.2003, 21:53


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



Владимир — ты прав он не совсем:
CODE
char *str()
{ char str[100];
...
return str;
}

функция возвращает указатель на локальную переменную (если быть точным, то указатель на область стека), которая перестаёт существовать после завершения работы функции (в стек могут быть записаны различные другие локальные переменные, адреса возвратов и т.п.). Собственно это и наблюдается.
Решить это проблему можно так:
1. объявив массив как static — в этом случае он имеет локальную область видимости, но глобальное время жизни и указатель на него будет иметь смысл пока не завершится программа.
2. вернув обьект AnsiString:
CODE
AnsiString str(void)
{AnsiString ret;
char str[100];
ifstream fi(123.txt);
fi.getline(str,sizeof(str),'\n');
fi.close();
ret=str;
return ret;
}

3. вернув обьект vector:
CODE
vector<char> str(void)
{
vector<char> ret;
ret.resize(100);
ifstream fi(123.txt);
fi.getline(&ret[0],ret.size(),'\n');
fi.close();
return ret;
}


Методы 2 и 3 считаются хорошим стилем программирования, но имеют более низкую производительность чем 1-й, но чтение с диска съест ещё больше времени (в разы) поэтому я рекомендую использовать 2 или 3-й метод (в зависимости от того, что надо — строка или массив байт).

Кстати хорошо, что здесь заядлых дэльфистов и java`шников нет, а то бы заплевали бы великий и могучий C...
Aladdin
Отправлено: 11.11.2003, 08:32


Не зарегистрирован







Да-да-да-да !!!
Все завертелось после того, как я объявил массив char str[100] в глобальных переменных. И вариант со static char str[100] то же
прокатил !!!
To: Георгий
1. Жор, по поводу AnsiString- этот объект является стандартом С++
или это фирменный прибамбас Борланда ? Если последнее, тогда
могут возникнуть проблемы с переносимостью.
2. А что такое vector, или где про него мжно почитать?
У меня книжка по С++ Подбельского, ну дык там то же я не встречал
упоменания про векторы ?
Георгий
Отправлено: 11.11.2003, 09:49


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



1. У Borland-AnsiString (bcb) или String(bc3.1-strng.h), у Watcom-String, у MS вроде тоже String.
2. это STL — в любой книжке, описывающей STL ты найдёшь векторы и многое другое. У borland-vector (vector.h), у watcom-WCValVector(wcvector.hpp), у MS- не знаю, но тоже есть — STL вроде стандартизировано.

В общем переносимость не пострадает — все современные компиляторы поставляются с этими классами.

Вернуться в Вопросы программирования в C++Builder