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();
ВСЕ ОК-ОБ
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 вроде стандартизировано.
В общем переносимость не пострадает — все современные компиляторы поставляются с этими классами. |
|