Помогите с fopen(), FileOpen()

Ответить

Код подтверждения
Введите код в точности так, как вы его видите. Регистр символов не имеет значения.

BBCode ВКЛЮЧЁН
[img] ВКЛЮЧЁН
[url] ВКЛЮЧЁН
Смайлики ОТКЛЮЧЕНЫ

Обзор темы
   

Развернуть Обзор темы: Помогите с fopen(), FileOpen()

Re: Помогите с fopen(), FileOpen()

Владмир » 13 сен 2007, 09:44

Absurd писал(а):У класса AnsiString есть метод .c_str(), он производит нужную конверсию.

Ваау! Я и не думал, что всё так просто! Как только я применил к инструкции
fr=fopen((Label1->Caption).c_str(),"r"); всё пошло как по маслу!
Я дописал свою программу, и она работает правильно!

Всем спасибо!
Отдельное бооольшое спасибо 2Absurd!!! :D

Re: Помогите с fopen(), FileOpen()

Владмир » 13 сен 2007, 09:30

Mihhail писал(а): Если используется FileOpen, то для определения длины файла можно применить функцию FileSeek, которая возвращает текущую позицию в файле.

2 Mihhail :
Спасибо конечно, что откликнулся, но я уже нашел выход через fread(). :)

Re: Помогите с fopen(), FileOpen()

Mihhail » 11 сен 2007, 21:38

Владмир писал(а): while(!eof(fr))
{
FileRead(fr,&buf[0],1);
switch(buf[0])
{
case 'q':buf1="й" ; break;
case 'w':buf1="q" ;break;
case 'e':buf1="p" ;break;
}
FileWrite(fw, buf1 , 1);
all++;
}

Нельзя смешивать такие разные функции. API-функция FileOpen возвращает int идетификатор совершенно другого рода нежели С-функция open. eof используется только совместно с последней!.

Если используется FileOpen, то для определения длины файла можно применить функцию FileSeek, которая возвращает текущую позицию в файле.
Примерно так:

Код: Выделить всё

all = FileSeek( fr , 0 , 2 );  //Смещаемся в конец файла
FileSeek( fr, 0 , 0 );   //Возвращаемся в самое начало файла

for( i = 0; i < all; i ++ )
{
FileRead( fr, buf, 1 );
switch(buf[0])
{
case 'q':buf1="й" ; break; 
case 'w':buf1="q" ;break; 
case 'e':buf1="p" ;break; 
}
}

Re: Помогите с fopen(), FileOpen()

Absurd » 08 сен 2007, 17:05

Владмир писал(а):Да, вы совершенно правы.

Проблема в fr=fopen("text.txt", "r"); и никак этот файл ( text.txt ) потом "на лету" не изменить (тип const char *). А AnsiString никак не конвертируется в const char* . Никакие операторы приведения типов не работают! :confused:

Или я просто чего-то не понимаю? Подскажите пожалуста, можно ли как-нибудь это решить?
У класса AnsiString есть метод .c_str(), он производит нужную конверсию.

Re: Помогите с fopen(), FileOpen()

Владмир » 08 сен 2007, 09:51

Absurd писал(а):А что мешает в fopen так сделать? Могу предположить что ты параметр AnsiString не можешь сконвертировать в char*.

Да, вы совершенно правы.

Проблема в fr=fopen("text.txt", "r"); и никак этот файл ( text.txt ) потом "на лету" не изменить (тип const char *). А AnsiString никак не конвертируется в const char* . Никакие операторы приведения типов не работают! :confused:

Или я просто чего-то не понимаю? Подскажите пожалуста, можно ли как-нибудь это решить?

Re: Помогите с fopen(), FileOpen()

Absurd » 03 сен 2007, 10:32

Владмир писал(а):Я имел ввиду, чтобы файл можно было открыть во время работы самой программы, причём какой именно файл, указывает пользователь (ну типа как в Explorer' е :) ).
А что мешает в fopen так сделать? Могу предположить что ты параметр AnsiString не можешь сконвертировать в char*.
Владмир писал(а): CreateFilе()/ReadFile()/CloseHandle()?
Хорошо я поработаю с ними, спасибо.
Нет, читать по одному символу лучше через fread() - он буферизует чтение. fread() внутри себя вызывает ReadFile(), вот что я имел в виду.

Re: Помогите с fopen(), FileOpen()

Владмир » 03 сен 2007, 09:00

Absurd писал(а):Что такое "Открыть файл на лету"?
Я имел ввиду, чтобы файл можно было открыть во время работы самой программы, причём какой именно файл, указывает пользователь (ну типа как в Explorer' е :) ).
Absurd писал(а): Вообще, на Win32 существует только один способ открытия файлов - CreateFilе()/ReadFile()/CloseHandle().
CreateFilе()/ReadFile()/CloseHandle()?
Хорошо я поработаю с ними, спасибо.

Re: Помогите с fopen(), FileOpen()

Absurd » 27 авг 2007, 12:29

Что такое "Открыть файл на лету"?
Вообще, на Win32 существует только один способ открытия файлов - CreateFilе()/ReadFile()/CloseHandle(). Эти функции обладают максимальными возможностями и поэтому имеют много параметров. Все остальные варианты из <stdio.h>, <io.h>, <iostream>, Borland sysutils это всего навсего обертки вокруг CreateFile()/ReadFile()/CloseHandle() которые половину параметров передают дефолтом.
-возвращает целое кол-во прочитанных байтов.
fread тоже возвращает
-В качестве идетификатора файла используется int, а не FILE *.
В чем мысл? Вообще int хуже подходит для идентификаторов чем указатель.
-является внешней и не требует прямого включения в исходник, файла "sysutils.hpp".
Зато зависима от Борланда, Delphi подразделение которого загибается, а на C++ они и вовсе забили тысячу лет назад. В MSVC++ и g++ этой функции нет.
Позволяет считывать определённое кол-во байтов( можно задать переменной).
А как же второй параметр у fread() ???
- этот самый void *Buffer, с которым я не мог разобраться.
В чем проблема? char* замечательно конвертируется в void*
А как ещё-то можно определить конец файла?
Если fread() прочитал меньше байт чем было запрошено, то как правило это означает конец файла. Это не правильный подход, но для файлов с блочного устройства типа HDD будет работать.

Re: Помогите с fopen(), FileOpen()

Владмир » 27 авг 2007, 12:00

Absurd писал(а):Что за "FileRead"?
Она находится в файле "sysutils.hpp" (...\Borland\CBuilder6\Include\Vcl )

extern PACKAGE int __fastcall FileRead(int Handle, void *Buffer, unsigned Count);

входит в namespace Sysutils;
возвращает целое кол-во прочитанных байтов.

там же находятся типовые ф-ии для открытия/создания/записи/поиска или определения существования файла. Сам я пока не полностью изучил файл, поэтому пользуюсь только этими ф-иями.
Absurd писал(а): Почему не fread() / fwrite() / feof() ?
Знаю про операции безбуфферного чтения файлов _read() из <io.h> и ReadFile() из <windows.h>.

На мой взгляд эта функция удобна:

-возвращает целое кол-во прочитанных байтов.
( int ret;
ret=FileRead(fr, &buff[0], n); )

-В качестве идетификатора файла используется int, а не FILE *.

-является внешней и не требует прямого включения в исходник, файла "sysutils.hpp".

-Позволяет считывать определённое кол-во байтов( можно задать переменной).

-вместе с ней можно использовать :
extern PACKAGE int __fastcall FileOpen(const AnsiString FileName, unsigned Mode);
что позволяет, как я уже говорил, удобно "налету" открывать нужный файл.
(int fr; fr=FileOpen("File.txt", fmOpenRead) - далее fr можно использовать, как дескриптор файла.)

не удобна:

- этот самый void *Buffer, с которым я не мог разобраться.
- использование feof(), eof() - не дает никакого результата! А как ещё-то можно определить конец файла?

а спомощью fread() / fwrite() / feof() нельзя "налету" открывать файл ( Прошу исправить меня если это не так :) ) , что при применении GUI интерфейса довольно плохо.

Re: Помогите с fopen(), FileOpen()

Absurd » 24 авг 2007, 14:36

Что за "FileRead"? Почему не fread() / fwrite() / feof() ?
Знаю про операции безбуфферного чтения файлов _read() из <io.h> и ReadFile() из <windows.h>, FileRead() не знаю.

Вернуться к началу