Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.93
GAME
23 / 23 / 3
Регистрация: 31.10.2009
Сообщений: 199
#1

Функция fopen возвращает нулевой указатель (Visual Studio) - C++

19.03.2010, 23:35. Просмотров 3541. Ответов 36
Метки нет (Все метки)

Здраствуйте)
У меня возникла очень странная проблема.просто мистика.

С чем может быть связано возвращение нулевого указателя в функции fopen.?
Я пишу в винАПИ.По пока с новыми функциями не разобрался(для работы с файлами)
Вот.И тут такое.Путь задан жестко.НО!она открывает его ИНОГДА, а чаще всего НУЛЛ возвращяет.Путь правильный.Потому,что по тому же пути из этого же фаила считывает инфу другая фун-я.ТАм всё норм.Файловый поток после считки закрываю.
Даже не знаю в чем может быть дело. =(

Добавлено через 1 час 20 минут
ТА....всё грусно.
Объясните тогда как работает OpenFile()
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2010, 23:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция fopen возвращает нулевой указатель (Visual Studio) (C++):

Функция принимает указатель на void и возвращает указатель на int - C++
Запишите прототип функции, которая принимает указатель на void и возвращает указатель на int.

Функция формирует массив и возвращает указатель на него - C++
Задание: написать функцию с аргументами: вещественное х, целое n. Функция формирует массив у: уk=\frac{{x}^{2k}}{k!} k=0,1,..,n-1 и...

Функция возвращает строку (или указатель на начало строки) - C++
Подскажите пожалуйста. Застрял на тривиальной задачке. Никак не могу добится чтобы функция возвращала корректно строку.(правильнее наверное...

Функция, получающая подстроку, возвращает испорченный указатель на строку - C++
Пытаюсь выделить подстроку в Microsoft Visual C++ 2013, чтобы убрать путь к файлу и оставить только имя файла. wchar_t *...

Как функция возвращает указатель на структуру в массив указателей - C++
Друзья, следующий вопрос, у меня есть функция, которая: создает указатель на структуру-> выделяет память-> заполняет из файла-> и...

Функция возвращает указатель на нужную ячейку переданного массива, но адрес другой - C++
Пишу котрольку. В функцию передается массив созданный из объектов на основе собственной структуры. Ищет в нем нужную ячейку по одному из...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
GAME
23 / 23 / 3
Регистрация: 31.10.2009
Сообщений: 199
22.03.2010, 23:25  [ТС] #16
так...зачем? даже если там некоректный путь файла(Хотя,такая проверка не помешает ),
я же пытаюсь после вызова этой функции открыть ДРУГой файл....

C++
1
fl=fopen("dbase.module/Vodafone_McLaren_Mercedes.txt","w");
Никак не связанный с тем,который я получаю из функции GetOpenFileName
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
22.03.2010, 23:30 #17
НЕ понял. Ты же вот пишешь:
Цитата Сообщение от GAME Посмотреть сообщение
Это окно мне нужно чтобы получить путь к картинке БМП
Так, потом ты этот путь используешь (присваиваешь его адрес File...)

И тут же говоришь "даже если там некоректный путь файла"

Так он нужен тебе ПРАВИЛЬНЫЙ ПУТЬ или нет?
GAME
23 / 23 / 3
Регистрация: 31.10.2009
Сообщений: 199
22.03.2010, 23:32  [ТС] #18
да он мне нужен правильный.(ну даже если он не правлиный прогу это не убъёт)

ну основная проблема в том что после этого другие файлы не открываються. =(
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
22.03.2010, 23:37 #19
Ну тогда совет только один.
Если тебе ВСЁ РАВНО, какой будет путь, просто какой-нибудь вручную напиши и всё. И не надо огород городить, не надо никаких вызовов GetOpenFileName (ведь вроде она тебе нужна, чтобы получить АБЫ КАКОЙ ПУТЬ! Чушь, конечно, но не я её реализую, эту чушь...)

Я сам ничё не придумал?

Можно предположить, что убрав вызов GetOpenFileName, файлы будут открываться нормально...
GAME
23 / 23 / 3
Регистрация: 31.10.2009
Сообщений: 199
22.03.2010, 23:43  [ТС] #20
Эм..

Файл картинки мне нужнен правильный.Но это не критично(Точней критично,но не в этом основная проблема), как я понимаю, наличи фаила можно потестить функцией CreateFile , Ну либо сразу-же попробовать получить по этому пути битовую карту. если не получиться - путь не правильный.
Я пытаюсь выяснить связь , между GetOpenFileName , и открытием других фаилов . понимаете ? основная задача для меня сейчас,сделать так чтобы работал и GetOpenFileName и fopen. Пока я этого не сделаю , бессмысленно думать о каких либо путях к фаилу. Потому ,что придётся придумывать ,как другим способом получить путь к файлу.
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
23.03.2010, 00:02 #21
Слушай, можно открыть файл fopen (), CreateFile (), OpenFile ()

ПО-моему, во всех этих случаях, первый параметр у всех трёх функций- имя файла (в том случае если файл лежит водной директории с твоей прогой, но это частный случай, его не рассматриваем) или же ПУТЬ К ФАЙЛУ. При чём путь ПОЛНЫЙ. Который тебе возвертает (вернее, не возвертает, по-моему, GetOpenFileName)

Ты передаёшь невесть что (сгенерированное GetOpenFileName) первым параметром в одну из этих функций (fopen (), допустим), она ни фига не открывает, естессно, выдаёт ноль.

И ты после этого не видишь связи между GetOpenFileName и открытием других файлов?
GAME
23 / 23 / 3
Регистрация: 31.10.2009
Сообщений: 199
23.03.2010, 00:13  [ТС] #22
ааааааа.Да нет же.
вот что я передаю в fopen!!

C++
1
fl=fopen("dbase.module/Vodafone_McLaren_Mercedes.txt","w");
Независимо от того что там сгенерировал этот тупой ОпенФилеНАме.
Я вобще не понимаю,как она может делать массивы "C:\xxx\yyy\" если блин '\' - это вобще часть управляющей конструкции.НО это ладно.я пытаюсь до вас донести вот что.
C++
1
2
3
4
5
6
7
8
9
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
 FILE *fl;
fl=fopen("dbase.module/Vodafone_McLaren_Mercedes.txt","w");//О ЧУДО ВСЕ РАБОТАЕТ
        return 0;
}

А вот так.fl=0x00000000 почему?!

C++
1
2
3
4
5
6
7
8
9
10
11
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
 FILE *fl;
char pht[MAX_PATH];
ShowOpenDialog(NULL,pht,"Выберите файл","",".bmp");
fl=fopen("dbase.module/Vodafone_McLaren_Mercedes.txt","w");//О ГОСПАДИ НУЛЛ?!!!!как так!!!!!???
        return 0;
}
Почему??"!! массив pht мне нужен не для этих целей! я его использую так :
C++
1
hBmp =(HBITMAP) LoadImage(NULL, pht, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
- и так всё прекрасно работает!
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
23.03.2010, 00:25 #23
Слушай, я бы хотел поковыряться, но мне этот путь непонятен:
"dbase.module/Vodafone_McLaren_Mercedes.txt"

Это какой-то экзотический путь.
Можешь удостоверить что всё так как ты сказал, но путь пусть воттак как-нибудь
выглядит,попроще то есть:
C++
1
fl=fopen("E:\\file.txt","w");
GAME
23 / 23 / 3
Регистрация: 31.10.2009
Сообщений: 199
23.03.2010, 00:38  [ТС] #24
ВОт!!!!вот это была умная мысль!!!!
только незнаю почему вы так любите '\'.

ВОт так прошли все тесты удачно(файл создан)

C++
1
FILE *fl=fopen("C:/Downloads/file.txt","w+");
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
23.03.2010, 00:39 #25
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h>
#include <windows.h>
#include <Winuser.h>
 
char *ShowOpenDialog(HWND HWndOwner, char *FileName, char *Title,char *InitialDir, char *Filter) { 
    OPENFILENAME ofn; 
    ZeroMemory(&ofn, sizeof(OPENFILENAME)); 
 
    char szFile[MAX_PATH]; 
        char oFile[MAX_PATH];
    ZeroMemory(szFile, MAX_PATH); 
 
    // инициализация OPENFILENAME 
    ofn.lStructSize = sizeof(OPENFILENAME); 
    ofn.hwndOwner = HWndOwner; 
    ofn.lpstrFile = (LPSTR)szFile; 
    ofn.nMaxFile = MAX_PATH; 
    ofn.lpstrFilter =(LPSTR) Filter; 
    ofn.nFilterIndex = 0; 
    ofn.lpstrTitle = (LPSTR)Title; 
    ofn.lpstrInitialDir =(LPSTR) InitialDir; 
    ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST; 
 
    // Отображаем окно Open dialog. 
    if (GetOpenFileName ((LPOPENFILENAMEW)&ofn)) 
    { 
        //strcpy(FileName, (char *)ofn.lpstrFile);
                memcpy(FileName,ofn.lpstrFile,MAX_PATH);
                //copy_rc(FileName,oFile,'\','\');
                FileName=ofn.lpstrFile;
        return ofn.lpstrFile; 
    } 
    else {
         }
    return false; 
}
 
 
int  main (){
 
FILE *fl;
 
char pht[256];
ShowOpenDialog(NULL,pht,"Выберите файл","",".bmp");
 
 
if (fl=fopen("E:\\file.txt","w")) {
 MessageBox (0, "всё работает", "всё работает", 0);
}
 
else {
 MessageBox (0, "всё плохо", "всё плохо", 0);
}
 
 
 
 
 
        return 0;
}
Парень, вот твой код.
Я лишь упростил объявление main, чтобы компилятор хавал
Как видишь, выводится объявление "Всё работает"

Да, я открываю свой файл , уж больно мне твой путь непонятен.
С окном, созданным GetOpenFileName не работаю, как только он появляется, жму на крестик.
GAME
23 / 23 / 3
Регистрация: 31.10.2009
Сообщений: 199
23.03.2010, 00:40  [ТС] #26
Блин, как я счастлив
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
23.03.2010, 00:41 #27
Хм... Странно, что ты не используешь MessageBox для проверки. Должен знать вроде.

Добавлено через 20 секунд
А чё было-то? Я не понял
GAME
23 / 23 / 3
Регистрация: 31.10.2009
Сообщений: 199
23.03.2010, 00:47  [ТС] #28
Только теперь вопрос.Как же мне сохранять фаилы исходя из папки где лежит программа? ведь заранее не известно , где она будет.
А если я хочу сохранить например(у меня)
C:/Projects/one/dbase.module/.....

Но если её переместить этот путь уже будет не верен, понимаете о чем я?

Добавлено через 58 секунд
Было то,что краткий путь переставал работать после вызова опенфиленаме =((((( вот обдино ((( столько дней убил.

Добавлено через 2 минуты
ЗЫ я использовал для проверки точки остановки
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
23.03.2010, 00:51 #29
Ты меня не путай. Ты хочешь сказать, что работаешь в винде, и у тебя в текущей директоРии есть папка
dbase.module (именно так, с точкой)

В которой, в свою очередь, есть текстовый файл

Vodafone_McLaren_Mercedes.txt?

И вся эта херь соединена обратным слэшем и худо бедно
Vodafone_McLaren_Mercedes.txt

открывался, так что ли?
Ну ни фига себе... Век живи, век учись. Если дело в этом, ты бы прекратил экзотику всё таки.
Обратный слэш для линя, точка только перед расширением файла, как-то так... Чтобы головняков не было...
GAME
23 / 23 / 3
Регистрация: 31.10.2009
Сообщений: 199
23.03.2010, 00:56  [ТС] #30
окэй.Буду знать)))) это была плохая идея так назвать папку.

Добавлено через 3 минуты
Насчёт обратного слэша...
C:\\Downloads\file.txt -нэ
C:\\Downloads/file.txt -да
C:/Downloads/file.txt -да
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2010, 00:56
Привет! Вот еще темы с ответами:

Функция с указателем и индексом(Удаляет в строке лидирующие пробелы. Возвращает указатель на преобразованную строку.) - C++
Ребята помогите зачет получить, на парах не был..( Написать следующие функции в двух вариантах: с использованием индексов и...

Функция alltrim удаляет из строки начальные и конечные пробелы и возвращает указатель на преобразованную строку - C++
Дали задание в ВУЗе. Назначение программы: Функция alltrim удаляет из строки начальные и конечные пробелы и возвращает указатель на...

Деревья С++ (функция, которая получает указатель на корень дерева и возвращает длину самой длинной ветки на дереве) - C++
Здравствуйте! Помогите, пожалуйста, в написании функции ,которая получает указатель на корень дерева и возвращает длинну самой длинной...

Функция принимает указатель на динамический массив и возвращает его же, но без чисел полиндромов (читается с обоих сторон одинаково - 234432) - C++
Вот мое решение, подскажите, пожалуйста, что изменить, чтобы заработала программа: # include &lt;iostream&gt; # include &lt;stdlib.h&gt; #...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.03.2010, 00:56
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru