Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Доступ к безымяный файл запрешен


Автор: GoodMan 9.3.2003, 04:07
Код

//открываем файл
CFile file("index.htm", CFile::modeRead | CFile::modeWrite);

//читаем данные
char s[1000001];
int bytesRead = file.Read(s, 1000000);
s[bytesRead] = 0;
CString str = s;

   str.Replace("script", "");

file.Write((LPCTSTR)str, bytesRead);
file.Close();


При выполнении данного кода выдается сообщение: Доступ к безымяный файл запрешен

in than problem?

Автор: Step 9.3.2003, 04:23
возможно это файл используется, возможно ты не правильно указываеш имя, или данный файл отсутствует в директории, надо указать правильный путь

Автор: Baa 9.3.2003, 05:54
Эх, вы, знатоки MFC smile.gif
Вот так надо открывать smile.gif
Код

CFile file("index.htm", CFile::modeReadWrite);

и все пучком будет smile.gif

Автор: Step 9.3.2003, 06:06
Baa врядли это поможет, операция или даст тот же результат.

Автор: Baa 9.3.2003, 08:01
Step, может проверишь сначала? wink.gif

Автор: GoodMan 9.3.2003, 08:12
Цитата
Эх, вы, знатоки MFC
- я только начал изучать Visual C++.

Спасибо Baa. Получилось.

Код


//открываем файл
CFile file("index.htm", CFile::modeReadWrite);

//читаем данные
char s[1000001];
int bytesRead = file.Read(s, 1000000);
s[bytesRead] = 0;
CString str = s;

//изменяем данные
str.Replace("script", "");

//новый размер
bytesRead = sizeof(str);

//сохраняем данные
file.Write((LPCTSTR)str, bytesRead);
file.Close();


Метод Replace возвращает не 0, тем не менее, ни каких изменений в файле не обнаруживается.
Что на это раз я сделал не так?

Автор: Baa 9.3.2003, 08:52
Вот smile.gif правд все это великие извращения... я бы по-другому все сделал smile.gif
Код

//открываем файл
CFile file("c:\\333.htm", CFile::modeReadWrite);

//читаем данные
char s[1000001];
int bytesRead = file.Read(s, 1000000);
s[bytesRead] = 0;
CString str = s;

//изменяем данные
str.Replace("script", "");

//новый размер
bytesRead = str.GetLength();

file.SetLength (0);
//сохраняем данные
file.Write(str.GetBuffer(), bytesRead);
file.Close();

Автор: GoodMan 9.3.2003, 09:05
А как по другому? Если можно, приведи пример пожалуста.

Мне важно, что бы эти изменения в htm - файлах происходили с наибольшей скоростью.
Я пытаюсь написать чистильщик сайтов, загруженных Teleport или Offline Explorer.
Хочу убрать из html страниц "ненужную" информацию, которая не нужна в off-line.

На Delphi эта программа написана, но она работает медленно.


Автор: Baa 9.3.2003, 09:19
да мой способ более косметический... например выделение точного количества памяти под файл...
а вообще, чистый API работает быстрее, чем MFC.

Автор: GoodMan 9.3.2003, 09:27
да уж "косметический" - в файле (index.htm) остается только:

Код
<HTM


все остальное содержимое страницы улетучивается, после сохранения в файл.
Блин как это все в Delphi просто:

Код
//**********************************************************************************************************************
//      удаляем скрипт
//**********************************************************************************************************************

       PosHref := Pos('<script', TempText);
       if (PosHref <> 0) and (Form1.chDeleteScript.Checked) then
           begin
             //определяем начальный индекс ссылки
lab2:
             MyPos := Pos('<script', Copy(TempText, PosHref + 8, Length(Text) - PosHref - 8));
             if MyPos <> 0 then
                begin
                  MyPos := MyPos + 7 + PosHref;
                  if Pos('</script>', Copy(TempText, PosHref, MyPos - PosHref)) = 0 then
                     begin
                      PosHref := MyPos;
                      goto lab2;
                    end;
                end;

             FirstHref := PosHref;

             //определяем конечный индекс ссылки
             LastHref := Pos('</script>', Copy(TempText, PosHref, (Length(Text) - PosHref))) + 8 + PosHref;

             //убераем неработающую ссылку
             TempText := DeleteSubString(TempText, FirstHref, LastHref - FirstHref);
             Text := DeleteSubString(Text, FirstHref, LastHref - FirstHref);
             goto lab1;

           end;

Автор: Baa 9.3.2003, 10:16
Дык я ж токо твой код переделывал... а чего он с файлом делает я и не сморел...
А про косметику - всмысле, что если бы я писал все с 0, то написал бы по-другому.

Автор: GoodMan 9.3.2003, 11:13
Ладно, упростим задачу:

1. Метод Replace справляется со своей задачей.
Т.е. он в файле заменяет подстроки "script" на "".
Это я проверил с помощью AfxMessageBox(str);

2. Сохранение в файл производится не корректно.
Т.е. то, что мне показывала функция AfxMessageBox НЕ СОХРАНЯЕТСЯ В ФАЙЛ.
Ответственность за это несет следующий код:

Код

file.SetLength (0);
file.Write((LPCTSTR)str, sizeof(str));
file.Close();


ВОПРОС: Что надо сделать, что бы содержимое переменной str сохранялось в файл корректно?

Автор: Baa 9.3.2003, 20:21
Ну не знаю... вот ЭТОТ код отлично работает...
Код

CFile file("c:\\333.htm", CFile::modeReadWrite);

//читаем данные
char* s = new char [(unsigned)file.GetLength ()+1];
int bytesRead = file.Read(s, (unsigned)file.GetLength ());
s[bytesRead] = 0;
CString str = s;
delete [] s;

//изменяем данные
str.Replace("script", "");

//новый размер
file.SetLength (0);
//сохраняем данные
file.Write(str.GetBuffer(), str.GetLength ());
file.Close();

Автор: GoodMan 9.3.2003, 20:59
Спасибо Baa. Этот код действительно работает.

Если можно последний вопрос:
Как содержимое переменной str преобразовать к нижнему регистру (UpperCase).
Это для того, что бы удалялись все подстроки "script" в переменной str.



надо было раньше зайти сюда: http://www.sources.ru/cpp_files.shtml тогда бы этих глупых вопросов небыло.

Автор: Baa 10.3.2003, 04:06
str.MakeLower ();

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)