Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
chelovechek
сишник
Автор FAQ
130 / 37 / 1
Регистрация: 25.07.2009
Сообщений: 291
#1

fseek вылетает

19.09.2009, 14:00. Просмотров 1646. Ответов 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
#include <stdio.h>
#include <windows.h>
char *filename;
long size;
File *in;
char *infile;
int main(int argc, char *argv[])
{
filename = "file.bin";
try
    {
        in = fopen(filename,"rb");
    }
    catch(...)
    {
        printf("File %s not found!",filename);
        return 0;
    }
        fseek(in,0,SEEK_END);
        size = ftell(in);
        rewind(in);
        fread((void *)infile,sizeof(char),size,in);
        fclose(in);
Компилируется без ошибок, но при запуске вылетает на строке fseek(in,0,SEEK_END); с ошибкой "0x00000005. Нарушение прав доступа при записи "0x000004".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2009, 14:00
Ответы с готовыми решениями:

Функция fseek
Здраствуйте! Пишу сейчас телефонную книгу. Точнее что-то наподобие этого....

fseek для ab
Нигде не могу найти работает ли fseek для режима ab??? или у аb статически...

fseek / fread
Всем привет! Такой вопрос возник. Есть строка, состоящая из нескольких...

Fseek и структуры
Добрый день,не могу разобраться с fseek в структурах / Нужно сделать запрос...

fseek не работает
Нужно записать данные в структурированный текстовый файл. Проблема заключается...

15
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
19.09.2009, 15:22 #2
chelovechek, почему ты не проверяешь, что у тебя in вообще рабочий? Может, у тебя вообще файл не открылся. Может, FILE?
1
chelovechek
сишник
Автор FAQ
130 / 37 / 1
Регистрация: 25.07.2009
Сообщений: 291
19.09.2009, 15:27  [ТС] #3
В программе FILE *.
Получается, try ... catch с fileopen не ловят. А так да, in пустой.
0
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
19.09.2009, 15:34 #4
chelovechek, а почему try должен ловить fileopen? Это что, исключение? Файла, например, нет на диске. Или на его открытие нет прав. Это нормальная ситуация, а не исключительная. try тут не при чем.
0
RazorQ
582 / 349 / 15
Регистрация: 06.02.2009
Сообщений: 1,386
19.09.2009, 16:29 #5
chelovechek, проверяй так
C
1
2
if((in = fopen(filename, "rd")) == NULL)
/* файл не открылся */
0
chelovechek
сишник
Автор FAQ
130 / 37 / 1
Регистрация: 25.07.2009
Сообщений: 291
19.09.2009, 17:17  [ТС] #6
теперь вылетает strcat.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
char *filename, *picname;
FILE *in;
long size;
char *infile;
int main(int argc, char *argv[])
{
    //if(argc < 2)return 0;
    //filename = argv[1];
    filename = "prog.exe";
    printf("You selected file %s\n",filename);
    if(argc == 3){
        picname = argv[2];
    }
    else
    {
        strcpy(picname,filename);
        if((!picname)||(!filename)){ return 2; }
        strcat(picname,".bmp");
    }
Не возвращает 2, а вылетает на strcat.
0
Gravity
569 / 563 / 64
Регистрация: 29.01.2009
Сообщений: 1,274
19.09.2009, 17:32 #7
А память кто будет выделять для picname?
1
chelovechek
сишник
Автор FAQ
130 / 37 / 1
Регистрация: 25.07.2009
Сообщений: 291
19.09.2009, 17:46  [ТС] #8
Опять проблема с fseek
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
char filename[MAX_PATH];
char picname[MAX_PATH];
FILE *in;
char *infile;
long size;
int main(int argc, char *argv[])
{
    //if(argc < 2)return 0;
    strcpy(filename,"C:\\Users\\User\\Documents\\Visual Studio 2008\\Projects\\app2pic\\Release\\prog.exe");
    //strcpy(filename,argv[1]);
    printf("You selected file %s\n",filename);
    if(argc == 3){
        strcpy(picname,argv[2]);
    }
    else
    {
        strcpy(picname,filename);
        if((!picname)||(!filename)){ return 2; }
        strcat(picname,".bmp");
    }
    printf("Output file name is %s\n",picname);
        in = fopen(filename,"rb");
    if(!in)
    {
        printf("File %s not found!",filename);
        return 1;
    }
        fseek(in,0,SEEK_END);
}
0
accept
4833 / 3255 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
20.09.2009, 09:27 #9
C99 7.19.9.2
Код
3 For a binary stream, the new position, measured in characters from the beginning of the
  file, is obtained by adding offset to the position specified by whence. The specified
  position is the beginning of the file if whence is SEEK_SET, the current value of the file
  position indicator if SEEK_CUR, or end-of-file if SEEK_END. A binary stream need not
  meaningfully support fseek calls with a whence value of SEEK_END.
короче говоря, не юзай этот способ
там может быть неопределённый конец файла из-за b
можно дойти до конца файла и применить fsetpos, она более разработана
или прочитать файл до конца, применить ftell, перемотать и дальше работать
0
chelovechek
сишник
Автор FAQ
130 / 37 / 1
Регистрация: 25.07.2009
Сообщений: 291
20.09.2009, 14:39  [ТС] #10
Решил пойти другим путем, загружая файл через fgetc:
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
...
struct file_info
{
    char *name;
    char buf[7500000]; //максимальный размер файла - 7.5 мб.
    long size;
};
...
file_info file_load(FILE *f)
{
    char buff;
    long fl;
    file_info finfo;
    rewind(f);
    buff = (char)fgetc(f);
    while((!feof(f))&&(fl < 7500000))
    {
        finfo.buf[fl] = buff;
        fl++;
        buff = fgetc(f);
    }
    finfo.size = fl;
    fclose(f);
    return finfo;
}
В итоге получил stack overflow.
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,528
20.09.2009, 18:09 #11
Это верный путь. Как и другие, кстати.
Значит, первое
1) Перед циклом инициализируй fl нулём;
2) 7500000 слишком большое значение. У меня из-за этого не работало. Убирай один ноль.
3) Зачем ты вводдишь переменную char buff ? Непонятно

Это что, ты сперва в неё считываешь символ из файла, а потом в строку? Непонятно. То есть так я бы упростил
C++
1
2
3
4
5
 while((!feof(f))&&(fl < max_razmer_faila))
        {
                finfo.buf[fl++] = fgetc(f);
        }
        finfo.size = fl-1;
C типом long не разбирался, но вроде корректно всё выводит. Всё.
1
chelovechek
сишник
Автор FAQ
130 / 37 / 1
Регистрация: 25.07.2009
Сообщений: 291
20.09.2009, 18:34  [ТС] #12
kravam, сделал, как ты написал.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define MAX_FILE_SIZE 750000
struct file_info
{
    char buf[MAX_FILE_SIZE];
    long size;
};
file_info file_load(FILE *f)
{
    long fl = 0;
    file_info finfo;
    rewind(f);
    while((!feof(f))&&(fl < MAX_FILE_SIZE))
        {
                finfo.buf[fl++] = fgetc(f);
        }
        finfo.size = fl-1;
    fclose(f);
    return finfo;
}
Все равно Stack Overflow.
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,528
20.09.2009, 19:07 #13
Давай полностью нерабочий код. Только не загромождай, самое неободимое.
Функция main, необходимые определения-вызовы, заголовочные файлы.
0
chelovechek
сишник
Автор FAQ
130 / 37 / 1
Регистрация: 25.07.2009
Сообщений: 291
20.09.2009, 19:26  [ТС] #14
Чтение работает, но возникла следующая проблема:
C++
1
2
3
4
5
6
char *hdr;
char tmp;
long size;
...
tmp = 54+size;
strcat(hdr,&tmp);
Необработанное исключение в "0x000812ea" в "app2pic.exe": 0xC0000005: Нарушение прав доступа при записи "0x000821bb".

Не по теме:

Приближаюсь к концу файла ;-)



Добавлено через 16 минут
Все скомпилировалось без ошибок. Всем спасибо за помощь!
0
kravam
быдлокодер
1709 / 896 / 105
Регистрация: 04.06.2008
Сообщений: 5,528
20.09.2009, 22:06 #15
Ну и ещё один штрих ко всему этому. И вопрос к более опытным товарищам.
...Размышляя на лоне природы над бренностью всего сущего, я пришёл к выводу, что вообще-то функция file_load возвращает очень немаленький объём информации. Проще говоря, переменная типа file_info, объявленная в теле этой функции при возврате копируется.
Считаю, что целесообразно такого копирования избежать, сделав функцию file_load встроеной,
то есть, объявив её так:

C++
1
inline file_info file_load(FILE *f);
Я прав, друзья?
0
accept
4833 / 3255 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
21.09.2009, 08:15 #16
есть ещё метод fopen(filename, "ab+");
и применение ftell'а
но у меня оно дало ноль, только при записи туда одного символа, ftell сработал

Цитата Сообщение от kravam
что вообще-то функция file_load возвращает очень немаленький объём информации
вообще, принято возвращать указатель на структуру, а перед этим подавать тоже указатель в функцию (пример time.h, где всё пронизано указателями)
а вместо таких больших данных юзать динамическую память, которую можно в любой момент изменить в размерах

так что можно юзать
C
1
2
3
    while (getc(f) != EOF)
        ;
    size = ftell(f);
пример сработавший

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
#include <stdio.h>
 
main()
{
    FILE *fp;
    long size;
    
    fp = fopen("file", "rb");
    
    if (!fp)
        return 1;
    
    while (getc(fp) != EOF)
        ;
        
    size = ftell(fp);
        
    rewind(fp);
    
    printf("%d" "\n", size);
    
    fclose(fp);
    
    return 0;
}
0
21.09.2009, 08:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2009, 08:15

работа с fseek и файлами
задача: совершить &quot;прыжок&quot; по строкам файла test.txt (строк, предположим, 20)...

Что делает fseek?
Что делает fseek и зачем он нужен? fseek(firstFile,0,SEEK_SET); ...

Функции fseek, _fseeki64
Ребят как по умному объяснить преподавателю что я использую функцию _fseeki64...


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

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

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