Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/34: Рейтинг темы: голосов - 34, средняя оценка - 4.76
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
1

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

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

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

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

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

Стандартная функция fopen возвращает не NULL и не значение
Ребят тока начинаю писать на си юзаю fopen, но она возвращает 0xcccccc, т.е. не NULL и не...

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

Функция для транслитерации строки возвращает нулевой результат
Написал следующую функцию для транслитерации букв, но результат никакой не показывает, пусто, что...

Функция не возвращает указатель на структуру
как зделать. пробывал так typedef struct str str ; struct str{ /* */ }

36
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
20.03.2010, 00:43 2
GAME, а код можно увидеть?
0
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
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
21.03.2010, 13:21 4
НУ я бы и рад помочь, но у меня не линкуется что-то эта вот функция
Что делать, если линкёр не может присоединить API- функцию?
0
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
21.03.2010, 22:42  [ТС] 5
странно..по идее должно работать...
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
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
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
22.03.2010, 10:05 7
GAME, знаком разделителя является '\\', а не '/'.
dbase.module\\Vodafone_McLaren_Mercedes.txt
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
22.03.2010, 10:13 8
там у них два знака разделителя
запутанная история в msdn'е
что-то про серверы
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
22.03.2010, 10:53 9
GAME, знаком разделителя является '\\', а не '/'.
dbase.module\\Vodafone_McLaren_Mercedes.txt
Тем не менее почти везде WinAPI понимает '/' в качестве разделителя.
0
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
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
22.03.2010, 20:55 11
В теме очень много всего, мне не осилить всю. Но вот это вот заинтересовало:
Цитата Сообщение от GAME Посмотреть сообщение
вы понимаите, дело не в этом. Фаилы перестают открываться после вызова функции
То есть я правильно понимаю, что появляется окно, ты выбираешь файл. тычешь в него и не можешь открыть. Так?

(Хе, у меня в упрощённом варианте после того, как я вывожу имя файла в окно для выбора, это окно ЗАКРЫВАЕТСЯ)
Если ЭТА проблема актуальна, есть небольшой совет тык скыть...
0
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
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
22.03.2010, 23:13 13
Цитата Сообщение от GAME Посмотреть сообщение
Это окно мне нужно чтобы получить путь к картинке БМП
Я правильно понял, что путь сохраняется в ofn.lpstrFile, который потом ты используешь, как надо?
0
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
22.03.2010, 23:17  [ТС] 14
Да, я его копирую..кудато туда...в массив чар *FileName, и использую .
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
22.03.2010, 23:21 15
Ясно.
Слушай, а я, может невнимательно смотрел, но я НИГДЕ НЕ УВИДЕЛ У ТЕБЯ ПРОВЕРКИ ТОГО, ЧТО после УДАЧНОГО вызова GetOpenFileName в ofn.lpstrFile помещён-таки корректный путь файла. Или такая проверка всё же есть? Если нет, могу подсказать,как сделать.
0
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
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
22.03.2010, 23:30 17
НЕ понял. Ты же вот пишешь:
Цитата Сообщение от GAME Посмотреть сообщение
Это окно мне нужно чтобы получить путь к картинке БМП
Так, потом ты этот путь используешь (присваиваешь его адрес File...)

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

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

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

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

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

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

Функция min_element() возвращает указатель на ноль
Необходимо найти максимальный элемент среди минимальных в двумерном массиве. Сначала ищу...

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

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

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

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

Функция находит минимальный элемент массива и возвращает указатель на него
Функция находит минимальный элемент массива и возвращает указатель на него. С использованием этой...


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

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