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

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

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

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

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

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

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

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

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

36
Эксперт JavaЭксперт С++
 Аватар для M128K145
8384 / 3617 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
20.03.2010, 00:43
GAME, а код можно увидеть?
0
 Аватар для GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
21.03.2010, 13:08  [ТС]
Цитата Сообщение от 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
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
21.03.2010, 13:21
НУ я бы и рад помочь, но у меня не линкуется что-то эта вот функция
Что делать, если линкёр не может присоединить API- функцию?
0
 Аватар для GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
21.03.2010, 22:42  [ТС]
странно..по идее должно работать...
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
22.03.2010, 10:03
Цитата Сообщение от 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);
}
Code
1
2
3
[guest@station test]$ ./test
error: No such file or directory
[guest@station test]$
Добавлено через 3 минуты
C
1
txt\0"
там уже есть нуль-символ
все строки "" включают невидимый нуль-символ в конце
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
22.03.2010, 10:05
GAME, знаком разделителя является '\\', а не '/'.
dbase.module\\Vodafone_McLaren_Mercedes. txt
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
22.03.2010, 10:13
там у них два знака разделителя
запутанная история в msdn'е
что-то про серверы
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
22.03.2010, 10:53
GAME, знаком разделителя является '\\', а не '/'.
dbase.module\\Vodafone_McLaren_Mercedes. txt
Тем не менее почти везде WinAPI понимает '/' в качестве разделителя.
0
 Аватар для GAME
23 / 23 / 5
Регистрация: 31.10.2009
Сообщений: 199
22.03.2010, 19:25  [ТС]
вы понимаите, дело не в этом. Фаилы перестают открываться после вызова функции
C++
1
char *ShowOpenDialog(HWND HWndOwner, char *FileName, char *Title,char *InitialDir, char *Filter)
Если её не вызывать,проблем нету.я просто немогу найти связь между этой функ-й и открытием файлов.... бред какой-то....

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

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


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

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

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

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

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

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

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

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

Файл картинки мне нужнен правильный.Но это не критично(Точней критично,но не в этом основная проблема), как я понимаю, наличи фаила можно потестить функцией CreateFile , Ну либо сразу-же попробовать получить по этому пути битовую карту. если не получиться - путь не правильный.
Я пытаюсь выяснить связь , между GetOpenFileName , и открытием других фаилов . понимаете ? основная задача для меня сейчас,сделать так чтобы работал и GetOpenFileName и fopen. Пока я этого не сделаю , бессмысленно думать о каких либо путях к фаилу. Потому ,что придётся придумывать ,как другим способом получить путь к файлу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.03.2010, 23:43
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru