Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 18
1

fopen возвращает NULL

16.02.2012, 17:30. Показов 3031. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//Первая кнопка - выбор файла и печатание его имени в Edit1
void __fastcall TForm1::Button1Click(TObject *Sender)
{
unsigned long a,b,t;
  OPENFILENAME lpofn;
  char fname[260]={0};
  memset(&lpofn,0,sizeof(OPENFILENAME));
  memcpy(fname,Form1->Edit1->Text.c_str(),Form1->Edit1->Text.Length());
  lpofn.lStructSize=0x4c;//sizeof(OPENFILENAME);
  lpofn.hwndOwner=0;
  lpofn.hInstance=0;
  lpofn.lpstrFilter="Ôàéëû ïðîøèâîê ÀÂÂ (*.bin)\0*.bin\0\0";
  lpofn.lpstrCustomFilter=0;
  lpofn.nMaxCustFilter=0;
  lpofn.nFilterIndex=0;
  lpofn.lpstrFile=fname;
  lpofn.nMaxFile=260;
  lpofn.lpstrFileTitle=0;
  lpofn.nMaxFileTitle=0;
  lpofn.lpstrInitialDir=0;
  lpofn.lpstrTitle="×òåíèå ôàéëà ïðîøèâêè ÀÂÂ";
  lpofn.Flags=OFN_EXPLORER;
  lpofn.nFileOffset=0;
  lpofn.nFileExtension=0;
  lpofn.lpstrDefExt="bin";
  lpofn.lCustData=0;
  lpofn.lpfnHook=0;
  lpofn.lpTemplateName=0;
  if(GetOpenFileName(&lpofn)){
        Edit1->Text=lpofn.lpstrFile;
 
    }
}
 
void __fastcall TForm1::Button4Click(TObject *Sender)
{
FILE *BLD;
char *nameBLD = (char*)malloc(10000);
 strcpy(nameBLD, Edit1->Text.c_str());
 BLD = fopen(nameBLD,"r+b");
fseek(BLD, 0L, SEEK_END);/// ВОТ ЗДЕСЬ ПИШЕТ ACCESS VIOLATION т.к. BLD=NULL
 
}
это полный пипец, BLD = NULL, ХОТЯ errno=0 и perror не работает... файл выбран с правильным именем
подскажите пожалуйста, кто-нибудь, где ошибка?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.02.2012, 17:30
Ответы с готовыми решениями:

fopen возвращает NULL.
Добрый день. Ситуация следующая - имеется сервер и клиент. Связываются они друг с другом через...

Функция fopen возвращает нулевой указатель (Visual Studio)
Здраствуйте) У меня возникла очень странная проблема.просто мистика. С чем может быть связано...

CreateWindow возвращает NULL
Простейшая программа, но почему-то CreateWindow возвращает NULL, уже и не знаю где искать ошибку,...

OpenProcess возвращает NULL
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, ...

17
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
16.02.2012, 19:10 2
Лучший ответ Сообщение было отмечено как решение

Решение

А в каком формате в Edit1 путь к файлу? В таком:
"C:\Virtual Machines\XP\Windows XP Mode base.vhd"
?
Если да, то надо просто слэши отзеркалить:
"C:\\Virtual Machines\\XP\\Windows XP Mode base.vhd"
.
0
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
17.02.2012, 09:13 3
В BCB использовать fopen, malloc и т.д. как минимум глупо.
C++
1
2
int BLD = FileOpen(Edit1->Text, fmOpenRead);
int size = FileSeek (BLD, 0, 2);
И всё!
1
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
17.02.2012, 09:25 4
можно добавить проверочку:
C++
1
if(FileExists(nameBLD))BLD = fopen(nameBLD,"r+b");
1
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 18
17.02.2012, 15:00  [ТС] 5
Теперь такой вопрос. Мне надо читать из файла определённый диапазон адресов но в виде long int ( что важно число знаковое!)
Как это сделать функцией FileWrite?
Если просто подставить переменную то выдаёт следующую ошибку
[C++ Error] Unit1.cpp(171): E2034 Cannot convert 'unsigned long' to 'void *'

Добавлено через 3 минуты
я что-то тут подумал... не вот так ли?
C
1
2
3
4
char* buf;
long int = a;
FileRead(fr,buf,sizeof(long));
a=atol(buf);
0
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
17.02.2012, 15:05 6
Цитата Сообщение от alexbad Посмотреть сообщение
Мне надо читать из файла
Цитата Сообщение от alexbad Посмотреть сообщение
Как это сделать функцией FileWrite?
Простая логика говорит нам, что FileWrite - для записи. Для чтения используется FileRead
И если внимательно прочитать описание этой функции, то можно понять, что второй параметр отвечает за тип принимаемых данных, а третий за размер.
Например, FileRead(handle, buf, 2) считает 2 элемента типа int в объявленный массив int buf[]

Добавлено через 1 минуту
Цитата Сообщение от alexbad Посмотреть сообщение
я что-то тут подумал... не вот так ли?
Цитата Сообщение от alexbad Посмотреть сообщение
char* buf;
Еще хорошим тоном считается выделять память после объявления
0
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 18
17.02.2012, 15:08  [ТС] 7
что-то не работает
0
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
17.02.2012, 15:10 8
Цитата Сообщение от alexbad Посмотреть сообщение
что-то не работает
что-то неправильно. Пример из BCB вам поможет?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void __fastcall TForm1::Button1Click(TObject *Sender)
 
{
  int iFileHandle;
  int iFileLength;
  int iBytesRead;
  char *pszBuffer;
  if (OpenDialog1->Execute())
  {
    try
    {
      iFileHandle = FileOpen(OpenDialog1->FileName, fmOpenRead);
      iFileLength = FileSeek(iFileHandle,0,2);
      FileSeek(iFileHandle,0,0);
      pszBuffer = newchar[iFileLength+1];
      iBytesRead = FileRead(iFileHandle, pszBuffer, iFileLength);
      FileClose(iFileHandle);
 
      for (int i=0;i<iBytesRead;i++)
      {
        StringGrid1->RowCount += 1;
        StringGrid1->Cells[1][i+1] = pszBuffer[i];
        StringGrid1->Cells[2][i+1] = IntToStr((int)pszBuffer[i]);
      }
      delete [] pszBuffer;
    }
    catch(...)
    {
      Application->MessageBox("Can't perform one of the following file operations: Open, Seek, Read, Close.", "File Error", IDOK);
    }
  }
}
0
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 18
17.02.2012, 15:13  [ТС] 9
Цитата Сообщение от mimicria Посмотреть сообщение
Например, FileRead(handle, buf, 2) считает 2 элемента типа int в объявленный массив int buf[]
Добавлено через 1 минуту
такой код выдаёт
[C++ Error] Unit1.cpp(171): E2034 Cannot convert 'unsigned long' to 'void *'

а про FileWrite это опечатка, я ведь даже в примере FileRead написал

Добавлено через 2 минуты
просто у FileRead параметр void *
Тип char * подходит
А вот long нет
0
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
17.02.2012, 15:14 10
Цитата Сообщение от alexbad Посмотреть сообщение
такой код выдаёт
Такой какой? Приведите весь код, где объявлен массив, выделена память и происходит считывание.
Цитата Сообщение от alexbad Посмотреть сообщение
Тип char * подходит
А вот long нет
Это неправда, вот простой пример:
C++
1
2
3
4
5
6
7
8
 int handle=FileCreate("c:\\test.txt");
 int buf[2]={1,2};
 FileWrite(handle,buf,sizeof(buf));
 FileClose(handle);
 handle=FileOpen("c:\\test.txt", fmOpenRead);
 int buf2[2]={0,};
 FileRead(handle,buf2,sizeof(buf2));
 FileClose(handle);
0
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
17.02.2012, 15:20 11
передавайте адрес на long переменную
1
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 18
17.02.2012, 15:21  [ТС] 12
А если мне не нужен массив? Я работаю отдельно с каждым long , мне достаточно просто считать один, потом другой...
0
return (true);
1976 / 1111 / 221
Регистрация: 19.04.2011
Сообщений: 2,345
17.02.2012, 15:25 13
Цитата Сообщение от alexbad Посмотреть сообщение
А если мне не нужен массив?
Это так принципиально: выделить 10 переменных или массив из 10 элементов? Массив удобней имхо.
0
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
17.02.2012, 15:37 14
не нужно массив
C++
1
2
long xxx;
FileRead(iFileHandle, &xxx, sizeof(xxx));
1
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 18
17.02.2012, 15:52  [ТС] 15
Читать-то читает, но задом наперёд байты идёт
Напрмер в файле вот так идут байты 0С 00 83 00
а в переменную читается вот так
83000C
Бредово так, зачем нужна такая функция которая задом наперёд читает?
0
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
17.02.2012, 16:33 16
все читается правильно. число в переменную считывается корректно. если вы запишите в файл число 123. то и считаете 123. байты числа пишутся в файл в обратном порядке потому что они в памяти расположены именно в таком порядке, обратитесь к соотв. разделу литературы
0
0 / 0 / 0
Регистрация: 22.12.2011
Сообщений: 18
17.02.2012, 16:45  [ТС] 17
неплохая инфа
http://www.ibm.com/developerwo... u-endianc/
0
Модератор
3387 / 2159 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
17.02.2012, 16:56 18
если вы посылаете данные на машину работающую на альфе или вообще ваквантер какой нибудь то это действительно важно. для виндовс - расслабтесь
0
17.02.2012, 16:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.02.2012, 16:56
Помогаю со студенческими работами здесь

CreateWindowEx возвращает NULL
Почему то не создается окно, #include &lt;Windows.h&gt; #include &lt;WindowsX.h&gt; #include &lt;CommCtrl.h&gt;...

OpenDesktop возвращает NULL
hwinsta = OpenWindowStation(&quot;winsta0&quot;, FALSE, WINSTA_ACCESSCLIPBOARD...

QPixmap возвращает Null
QPixmap при подгрузке картинок из папки возвращает null когда грузит последние 3 картинки ...

GetForegroundWindow возвращает NULL из потока
Всем привет. Такая проблема: GetForegroundWindow возвращает нормальные результаты, копирую эту же...

Что возвращает time(NULL)?
Что возвращает функция time(NULL) ( что значит возвращаемое число ), при подключенной стандартной...

Функция IMG_LoadTexture постоянно возвращает NULL
У меня произошла проблема. Функция IMG_LoadTexture возвращает NULL в этой функции. int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru