Консультация № 110376
21.11.2007, 11:55
0.00 руб.
0 4 4
Привет экспертам! Только начинаю изучать С++Builder6. Основная задача сейчас у меня научиться работе с текстовыми файлами(копировать строки, извлекать подстроку, определять кол-во столбцов в файле разделенным каким-либо разделителем и т.д) Учусь по книге С++ Руководство для начинающих. Шилд. Своял для опытов простенькую формочку с парой кнопок и начал эксперементы. Пытаюсь открыть файл и сразу натыкаюсь на ошибку.При ближайшем рассмотрении ошибки понял, что все дело в слэше. В одной строке выводится путь с обратным слэшем, а команда открытия работает с прямым слэшем. Как это можно обойти? И еще, если у кого-нить есть ссылочки на хорошие мануалы для работы с текстом в С++Builder киньте мне плиз. Очень буду благодарен!

Приложение:
void __fastcall TForm1::Button2Click(TObject *Sender){ std::ifstream impf("Edit1->Text"); if(!impf) { ShowMessage ("Не удалось открыть файл!"); return; }}

Обсуждение

Неизвестный
21.11.2007, 13:19
общий
это ответ
Здравствуйте, Endru!
Не совсем понятно, всё - таки, на какую ошибку вы натыкаетесь? В какой входной строке путь с обратным слешем? Какая команда открытия работает с прямым слешем?
Хотелось бы более конкретных данных - как говорится - "Код в студию пожалуйста".
Приведённый вами код конечно не будет работать - вы пытаетесь открыть (в случае его существования) или создать (если такового нет) файл "Edit1->Text". Я думаю такого файла нет - так как в имени есть неразрешённый символ - ‘>‘. Поэтому и ошибка вылетает.Чтобы открывать в вашем случае файл с названием в Edit1->Text, нужно писать примерно так(см. приложение).
Слешь здесь абсолютно не причём.
Хороший мануал есть в MSDN и в справке C++Builder.

Приложение:
void __fastcall TForm1::Button2Click(TObject *Sender){ std::ifstream impf(Edit1->Text.c_str()); if(!impf) { ShowMessage ("Не удалось открыть файл!"); return; }}
Неизвестный
21.11.2007, 13:23
общий
это ответ
Здравствуйте, Endru!

Вряд ли дело в каких то слешах. К тому же я их у вас не вижу;))
Дело в том, что вы в конструктор объекта impf передаете непонятно что;)

Смотрим прототип вышеуказанного конструктора:

ifstream ( );
explicit ifstream ( const char * filename, ios_base::openmode mode = ios_base::in );

Первым параметром ожидается строка, в которой указан путь до открываемого файла. Вы же передаете строку дословно: "Edit1->Text" т.е. пытаетесь открыть файл с именем "Edit1->Text". Само собой такого не существует)

Скорее вы хотели взять путь файла, который был введен в Edit1 объект. Чтож, в поле Text он и находится. Но вот беда, Поле Text возвращает данные в виде AnsiString-строки. А конструктор ждет тип const char*. Ничего;) У класса AnsiString (а это класс, а не просто набор байтов) есть в свою очередь метод c_str(), который как раз возвращает содержимое себя как const char* str.
И еще, если конструктор не смог открыть файл, указанный ему как filename, в объекте устанавливается failbit в истину, который можно проверить методом fail().

С учетом всего сказанного, перепишем ваш код:

{
ifstream impf(Edit1->Text.c_str());
if(impf.fail()) {
ShowMessage ("Не удалось открыть файл!");
return;
}

}
___
Успехов!

Приложение:
{ ifstream impf(Edit1->Text.c_str()); if(impf.fail()) { ShowMessage ("Не удалось открыть файл!"); return; }}
Неизвестный
21.11.2007, 13:49
общий
это ответ
Здравствуйте, Endru!
Насколько я понял вопрос, вы не можете открыть файл.
Чтобы открыть файл
Вместо:
std::ifstream impf("Edit1->Text");
Нужно писать:
std::ifstream impf("Имя_вашего_файла.txt"); //если файл находится в той же папке что и проект, иначе полный путь до файла

Также не забудьте подключить необходимую библиотеку в Unit1.h:
#include <fstream.h>
Неизвестный
21.11.2007, 14:42
общий
это ответ
Здравствуйте, Endru!

Привет! Нужно сделать следующее:


Приложение:
void __fastcall TForm1::Button2Click(TObject *Sender){ std::ifstream impf(Edit1->Text.c_str()); /// Эта функция принимает char *, а не AnsiString if(!impf) { ShowMessage ("Не удалось открыть файл!"); return; }}
Форма ответа