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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.93
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
19.03.2010, 23:35     Функция fopen возвращает нулевой указатель (Visual Studio) #1
Здраствуйте)
У меня возникла очень странная проблема.просто мистика.

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

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

Функция возвращает указатель на нужную ячейку переданного массива, но адрес другой C++
C++ Функция alltrim удаляет из строки начальные и конечные пробелы и возвращает указатель на преобразованную строку
C++ Функция возвращает строку (или указатель на начало строки)
Функция с указателем и индексом(Удаляет в строке лидирующие пробелы. Возвращает указатель на преобразованную строку.) C++
C++ Функция принимает указатель на динамический массив и возвращает его же, но без чисел полиндромов (читается с обоих сторон одинаково - 234432)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
20.03.2010, 00:43     Функция fopen возвращает нулевой указатель (Visual Studio) #2
GAME, а код можно увидеть?
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
21.03.2010, 13:08  [ТС]     Функция fopen возвращает нулевой указатель (Visual Studio) #3
Цитата Сообщение от M128K145 Посмотреть сообщение
GAME, а код можно увидеть?
вы действительно хотите этого?))) там 1800+строк))) ну ладно.ща вырежу,то,что нужно.

Добавлено через 9 минут
Собственно проблема тут.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void SaveToFileLvl_Tech(tech *tec)
{
    FILE *fl;
    char flink[75]={"dbase.module/\0"};
    char *str;
    str=new char[strlen(tec->father->cname)+1];
    copy_rc(str,tec->father->cname,' ','_');
    strcat(flink,str);
    delete str;
    strcat(flink,".txt");
    fl=fopen("dbase.module/Vodafone_McLaren_Mercedes1.txt\0","w");
          // fl=fopen(flink,"w");
    //fputc(' ',fl);
    Fprint_Tech(tec,Buf);
    fclose(fl);
}

Это происходит раньше со списком.(формирование списк,и добавление к нему новых эл-в)
Вот так фаил открываеться и из него читаеться инфа.
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
tech *AddFromFile_LvlTech(tech *to,general *ptr)
{
    FILE *from;
    char ch;
    char *str;
    char flink[75]={"dbase.module/\0"};
    char mark[60],pilot[60],cntry[60],photo[MAX_PATH],nums[10],pts[10];
    int num,point;
    if(!ptr) return to;//Ошибка - нету гл. уровня   
    str=new char[strlen(ptr->cname)+1];
    copy_rc(str,ptr->cname,' ','_');
    strcat(flink,str);
    delete str;
    strcat(flink,".txt\0");
    to=NULL;
    if(!(from=fopen(flink,"r+"))) 
    {
        strcpy(ErrorMessg," Ошибка.\n Не найден файл \n\0");
        strcat(ErrorMessg,flink);
        if(MessageBoxA(MainWindow,ErrorMessg,"Ошибка.",MB_OKCANCEL)!=IDOK)
            return NULL; //Ошибка открытия файла
        else 
        {
            //CreateFile(flink,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);
            from=fopen(flink,"a+");
            fputc(' ',from);
        }
    }
    else
    {
        TechFile=from;
        fgetc(from);
        str=from->_ptr;
        while(1)
        {
            /*str=decode(from->_ptr);*/
            str=copy_c(';',nums,str);
            str=copy_c(';',pts,str+1);
            str=copy_c(';',pilot,str+1);
            str=copy_c(';',mark,str+1);
            str=copy_c(';',cntry,str+1);
            str=copy_c('#',photo,str+1);
            sscanf(nums,"%i",&num);
            sscanf(pts,"%i",&point);
            if(!(to=AddTech(to,pilot,mark,photo,cntry,num,point,ptr)))
            {
                strcpy(ErrorMessg," Ошибка\n Невозможно выделить память под новый элемент\0");
                return NULL;
            }
            *str++;
            if(*str++=='&')
                continue;
            else
                break;
        }
    }   
    fclose(from);
    return to;
}
Вот после работы этого участка кода фаил не открываеться.
1)вызов фун-и добавления при нажатии кнопки добавить новый эл-т.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
if(wParam==ID_ADD_TEC_FORM_B2)
        {
            GetDlgItemTextA(hWnd,ID_ADD_TEC_FORM_E1,pname,59);
            GetDlgItemTextA(hWnd,ID_ADD_TEC_FORM_E2,car,59);
            GetDlgItemTextA(hWnd,ID_ADD_TEC_FORM_E3,pos,59);
            GetDlgItemTextA(hWnd,ID_ADD_TEC_FORM_E4,pts,59);
            GetDlgItemTextA(hWnd,ID_ADD_TEC_FORM_E5,cntry,59);
            if(!*pname || !*car || !*pos || !*pts || !*cntry)
            {
er:             MessageBoxA(hWnd,"Заполните все поля!","Ошибка.",MB_OK);
                InvalidateRect(hWnd,NULL,RDW_ERASE);
                break;
            }
            sscanf(pos,"%i",&point);
            sscanf(pts,"%i",&num);          
            if(!ShowOpenDialog(hWnd,pht,"Выберите файл","dbase.module/",".bmp"))
                goto er;
            Main_Tech=AddTech(Main_Tech,pname,car,pht,cntry,num,point,printGen);
            printTech=Main_Tech;
            DestroyWindow(hWnd);
            break;
        }
Сама функция добавления
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
tech *AddTech(tech *tch,char *pilot,char *mark,char *photo,char *cntry,int num,int pts,general *faz)
{
    tech *tmp;
    try
    {
        tmp=new tech;
    }
    catch(bad_alloc xa)
    {
        return NULL;
    }
    tmp->downA=NULL;
    tmp->downE=NULL;
    tmp->downS=NULL;
    tmp->downT=NULL;
    tmp->father=faz;
    strcpy(tmp->pilot,pilot);
    strcpy(tmp->mark,mark);
    strcpy(tmp->photo,photo);
    strcpy(tmp->country,cntry);
    tmp->num=num;
    tmp->points=pts;
    tmp->next=tch;
    return tmp;
}

ВОТ сама структура tech
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef struct tech
{
    unsigned int num;
    unsigned int points;
    char pilot[60];
    char mark[60];
    char country[60];
    char photo[MAX_PATH];
    engine *downE;
    transm *downT;
    suspen *downS;
    airdyn *downA;  
    tech *next;
    general *father;
};
Всё палево происходит тогда,когда добавляешь новый элемент.Если ничего не меняя сохранять все норм.Там где идёт открытие файла пробовал жестко задавать путь и по разному.Файл на месте ,никуда не деваеться.

Добавлено через 7 часов 15 минут
.......

Добавлено через 2 часа 23 минуты
Всё.В топку)
Сделал винАПИшными функциями.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void SaveToFileLvl_Tech(tech *tec)
{
    char flink[75]={"dbase.module/\0"};
    char *str,*Buf;
    DWORD tmp0;
    Buf = new char[GetTechNumbers(Main_Tech)*460+1];
    str=new char[strlen(tec->father->cname)+1];
    copy_rc(str,tec->father->cname,' ','_');
    strcat(flink,str);
    delete str;
    strcat(flink,".txt");
    sprintf(Buf," ");
    HANDLE FileHandle;
    FileHandle=CreateFile("dbase.module/Vodafone_McLaren_Mercedes.txt\0",GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL , 0);
    Fprint_Tech(tec,Buf);
    WriteFile(FileHandle,Buf,strlen(Buf),&tmp0,NULL);
    CloseHandle(FileHandle);
}
Добавлено через 14 минут
Казалось бы.НО,проблема осталась.ААААААААААААААААААААААААААААААААААААААААААААААААА

Добавлено через 15 минут
НАшел проблему.Блин.Как так.Проблема где - то в этой функции. Можете посмотреть где ?
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
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(&ofn)) 
    { 
        //strcpy(FileName, (char *)ofn.lpstrFile);
        memcpy(FileName,ofn.lpstrFile,MAX_PATH);
        //copy_rc(FileName,oFile,'\','\');
        FileName=ofn.lpstrFile;
        return ofn.lpstrFile; 
    } 
    return false; 
}
Добавлено через 1 час 23 минуты
ну?кто поможет?)

Добавлено через 12 часов 45 минут
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
21.03.2010, 13:21     Функция fopen возвращает нулевой указатель (Visual Studio) #4
НУ я бы и рад помочь, но у меня не линкуется что-то эта вот функция
Что делать, если линкёр не может присоединить API- функцию?
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
21.03.2010, 22:42  [ТС]     Функция fopen возвращает нулевой указатель (Visual Studio) #5
странно..по идее должно работать...
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.03.2010, 10:03     Функция fopen возвращает нулевой указатель (Visual Studio) #6
Цитата Сообщение от GAME
С чем может быть связано возвращение нулевого указателя в функции fopen.?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
 
int main(void) /* ANSI C89 */
{
    FILE *ifp;
    
    ifp = fopen("file", "r");
    
    if (ifp == NULL) {
        fprintf(stderr, "error: %s" "\n", strerror(errno));
        exit(EXIT_FAILURE);
    }
    
    exit(EXIT_SUCCESS);
}
Код
[guest@station test]$ ./test
error: No such file or directory
[guest@station test]$
Добавлено через 3 минуты
C
1
txt\0"
там уже есть нуль-символ
все строки "" включают невидимый нуль-символ в конце
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
22.03.2010, 10:05     Функция fopen возвращает нулевой указатель (Visual Studio) #7
GAME, знаком разделителя является '\\', а не '/'.
dbase.module\\Vodafone_McLaren_Mercedes.txt
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
22.03.2010, 10:13     Функция fopen возвращает нулевой указатель (Visual Studio) #8
там у них два знака разделителя
запутанная история в msdn'е
что-то про серверы
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
22.03.2010, 10:53     Функция fopen возвращает нулевой указатель (Visual Studio) #9
GAME, знаком разделителя является '\\', а не '/'.
dbase.module\\Vodafone_McLaren_Mercedes.txt
Тем не менее почти везде WinAPI понимает '/' в качестве разделителя.
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
22.03.2010, 19:25  [ТС]     Функция fopen возвращает нулевой указатель (Visual Studio) #10
вы понимаите, дело не в этом. Фаилы перестают открываться после вызова функции
C++
1
char *ShowOpenDialog(HWND HWndOwner, char *FileName, char *Title,char *InitialDir, char *Filter)
Если её не вызывать,проблем нету.я просто немогу найти связь между этой функ-й и открытием файлов.... бред какой-то....

Добавлено через 30 минут
ну или у меня глюки в мозгу.Но есл из 3го поста в 3й рамочке с кодом закоментить строки 16-17 (как раз вызов этой функ-и) и передать в функ-ю добавления вместо pht например(что-угодно) "XXYXYXY" , то в фаил это сохраниться норм!!
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
22.03.2010, 20:55     Функция fopen возвращает нулевой указатель (Visual Studio) #11
В теме очень много всего, мне не осилить всю. Но вот это вот заинтересовало:
Цитата Сообщение от GAME Посмотреть сообщение
вы понимаите, дело не в этом. Фаилы перестают открываться после вызова функции
То есть я правильно понимаю, что появляется окно, ты выбираешь файл. тычешь в него и не можешь открыть. Так?

(Хе, у меня в упрощённом варианте после того, как я вывожу имя файла в окно для выбора, это окно ЗАКРЫВАЕТСЯ)
Если ЭТА проблема актуальна, есть небольшой совет тык скыть...
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
22.03.2010, 22:45  [ТС]     Функция fopen возвращает нулевой указатель (Visual Studio) #12
kravam, в общем то, да.


Но я хочу открыть не тот файл , который я выбираю после открытия окна . Это окно мне нужно чтобы получить путь к картинке БМП . вот . А потом я открываю(хочу открыть, даже не открыть, а перезаписать ) другой файл(Vodafone_McLaren_Mercedes) и записать туда инфу(включая и адрес картинки БМП). НО после того ,как прога вызвала ShowOpenDialog , другой файл(Vodafone_McLaren_Mercedes) перестает открываться. ( создаваться заного - перезаписываться)....Вот вкратце.

ЗЫ сначала я пробовал fopen , затем CreateFile . В обоих случаях фаилы создаються(открываються) если не вызывать ShowOpenDialog, если же её вызвать, в обоих вариантах неработает.(не создает файлы);
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
22.03.2010, 23:13     Функция fopen возвращает нулевой указатель (Visual Studio) #13
Цитата Сообщение от GAME Посмотреть сообщение
Это окно мне нужно чтобы получить путь к картинке БМП
Я правильно понял, что путь сохраняется в ofn.lpstrFile, который потом ты используешь, как надо?
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
22.03.2010, 23:17  [ТС]     Функция fopen возвращает нулевой указатель (Visual Studio) #14
Да, я его копирую..кудато туда...в массив чар *FileName, и использую .
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
22.03.2010, 23:21     Функция fopen возвращает нулевой указатель (Visual Studio) #15
Ясно.
Слушай, а я, может невнимательно смотрел, но я НИГДЕ НЕ УВИДЕЛ У ТЕБЯ ПРОВЕРКИ ТОГО, ЧТО после УДАЧНОГО вызова GetOpenFileName в ofn.lpstrFile помещён-таки корректный путь файла. Или такая проверка всё же есть? Если нет, могу подсказать,как сделать.
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
22.03.2010, 23:25  [ТС]     Функция fopen возвращает нулевой указатель (Visual Studio) #16
так...зачем? даже если там некоректный путь файла(Хотя,такая проверка не помешает ),
я же пытаюсь после вызова этой функции открыть ДРУГой файл....

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

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

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

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

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

Можно предположить, что убрав вызов GetOpenFileName, файлы будут открываться нормально...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2010, 23:43     Функция fopen возвращает нулевой указатель (Visual Studio)
Еще ссылки по теме:

C++ Деревья С++ (функция, которая получает указатель на корень дерева и возвращает длину самой длинной ветки на дереве)
C++ Функция, получающая подстроку, возвращает испорченный указатель на строку
C++ Как функция возвращает указатель на структуру в массив указателей

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

Или воспользуйтесь поиском по форуму:
GAME
 Аватар для GAME
22 / 22 / 3
Регистрация: 31.10.2009
Сообщений: 199
22.03.2010, 23:43  [ТС]     Функция fopen возвращает нулевой указатель (Visual Studio) #20
Эм..

Файл картинки мне нужнен правильный.Но это не критично(Точней критично,но не в этом основная проблема), как я понимаю, наличи фаила можно потестить функцией CreateFile , Ну либо сразу-же попробовать получить по этому пути битовую карту. если не получиться - путь не правильный.
Я пытаюсь выяснить связь , между GetOpenFileName , и открытием других фаилов . понимаете ? основная задача для меня сейчас,сделать так чтобы работал и GetOpenFileName и fopen. Пока я этого не сделаю , бессмысленно думать о каких либо путях к фаилу. Потому ,что придётся придумывать ,как другим способом получить путь к файлу.
Yandex
Объявления
22.03.2010, 23:43     Функция fopen возвращает нулевой указатель (Visual Studio)
Ответ Создать тему
Опции темы

Текущее время: 10:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru