Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
1

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

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

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

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

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

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

Функция формирует массив и возвращает указатель на него
Задание: написать функцию с аргументами: вещественное х, целое n. Функция...

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

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

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

36
M128K145
Эксперт JavaЭксперт С++
8327 / 3548 / 420
Регистрация: 03.07.2009
Сообщений: 10,708
20.03.2010, 00:43 2
GAME, а код можно увидеть?
0
GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
21.03.2010, 13:08  [ТС] 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 минут
0
kravam
быдлокодер
1710 / 897 / 105
Регистрация: 04.06.2008
Сообщений: 5,553
21.03.2010, 13:21 4
НУ я бы и рад помочь, но у меня не линкуется что-то эта вот функция
Что делать, если линкёр не может присоединить API- функцию?
0
GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
21.03.2010, 22:42  [ТС] 5
странно..по идее должно работать...
0
accept
4833 / 3255 / 455
Регистрация: 10.12.2008
Сообщений: 10,569
22.03.2010, 10:03 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"
там уже есть нуль-символ
все строки "" включают невидимый нуль-символ в конце
0
CyBOSSeR
Эксперт С++
2313 / 1686 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
22.03.2010, 10:05 7
GAME, знаком разделителя является '\\', а не '/'.
dbase.module\\Vodafone_McLaren_Mercedes.txt
0
accept
4833 / 3255 / 455
Регистрация: 10.12.2008
Сообщений: 10,569
22.03.2010, 10:13 8
там у них два знака разделителя
запутанная история в msdn'е
что-то про серверы
0
odip
Эксперт С++
7164 / 3222 / 77
Регистрация: 17.06.2009
Сообщений: 14,160
22.03.2010, 10:53 9
GAME, знаком разделителя является '\\', а не '/'.
dbase.module\\Vodafone_McLaren_Mercedes.txt
Тем не менее почти везде WinAPI понимает '/' в качестве разделителя.
0
GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
22.03.2010, 19:25  [ТС] 10
вы понимаите, дело не в этом. Фаилы перестают открываться после вызова функции
C++
1
char *ShowOpenDialog(HWND HWndOwner, char *FileName, char *Title,char *InitialDir, char *Filter)
Если её не вызывать,проблем нету.я просто немогу найти связь между этой функ-й и открытием файлов.... бред какой-то....

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

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


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

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

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

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

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

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

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

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

Файл картинки мне нужнен правильный.Но это не критично(Точней критично,но не в этом основная проблема), как я понимаю, наличи фаила можно потестить функцией CreateFile , Ну либо сразу-же попробовать получить по этому пути битовую карту. если не получиться - путь не правильный.
Я пытаюсь выяснить связь , между GetOpenFileName , и открытием других фаилов . понимаете ? основная задача для меня сейчас,сделать так чтобы работал и GetOpenFileName и fopen. Пока я этого не сделаю , бессмысленно думать о каких либо путях к фаилу. Потому ,что придётся придумывать ,как другим способом получить путь к файлу.
0
22.03.2010, 23:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2010, 23:43

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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