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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
chelovechek
сишник
Автор FAQ
130 / 37 / 0
Регистрация: 25.07.2009
Сообщений: 291
#1

fseek вылетает - C++

19.09.2009, 14:00. Просмотров 1564. Ответов 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".
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.09.2009, 14:00     fseek вылетает
Посмотрите здесь:

Функция fseek - C++
Здраствуйте! Пишу сейчас телефонную книгу. Точнее что-то наподобие этого. Появилась проблема. Мне необходимо из файла, в который раннее...

fseek / fread - C++
Всем привет! Такой вопрос возник. Есть строка, состоящая из нескольких &quot;записей&quot; в файле (буквы + числа). Нужно с помощью функций...

Fseek и структуры - C++
Добрый день,не могу разобраться с fseek в структурах / Нужно сделать запрос (zapros()) n-ой записи через fseek и вывести ее ,либо изменить...

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

fseek для ab - C++
Нигде не могу найти работает ли fseek для режима ab??? или у аb статически указатель стоит в конце файла? мне нужно в середину файла...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
19.09.2009, 15:22     fseek вылетает #2
chelovechek, почему ты не проверяешь, что у тебя in вообще рабочий? Может, у тебя вообще файл не открылся. Может, FILE?
chelovechek
сишник
Автор FAQ
130 / 37 / 0
Регистрация: 25.07.2009
Сообщений: 291
19.09.2009, 15:27  [ТС]     fseek вылетает #3
В программе FILE *.
Получается, try ... catch с fileopen не ловят. А так да, in пустой.
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
19.09.2009, 15:34     fseek вылетает #4
chelovechek, а почему try должен ловить fileopen? Это что, исключение? Файла, например, нет на диске. Или на его открытие нет прав. Это нормальная ситуация, а не исключительная. try тут не при чем.
RazorQ
576 / 343 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
19.09.2009, 16:29     fseek вылетает #5
chelovechek, проверяй так
C
1
2
if((in = fopen(filename, "rd")) == NULL)
/* файл не открылся */
chelovechek
сишник
Автор FAQ
130 / 37 / 0
Регистрация: 25.07.2009
Сообщений: 291
19.09.2009, 17:17  [ТС]     fseek вылетает #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.
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
19.09.2009, 17:32     fseek вылетает #7
А память кто будет выделять для picname?
chelovechek
сишник
Автор FAQ
130 / 37 / 0
Регистрация: 25.07.2009
Сообщений: 291
19.09.2009, 17:46  [ТС]     fseek вылетает #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);
}
accept
4820 / 3240 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
20.09.2009, 09:27     fseek вылетает #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, перемотать и дальше работать
chelovechek
сишник
Автор FAQ
130 / 37 / 0
Регистрация: 25.07.2009
Сообщений: 291
20.09.2009, 14:39  [ТС]     fseek вылетает #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.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,412
20.09.2009, 18:09     fseek вылетает #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 не разбирался, но вроде корректно всё выводит. Всё.
chelovechek
сишник
Автор FAQ
130 / 37 / 0
Регистрация: 25.07.2009
Сообщений: 291
20.09.2009, 18:34  [ТС]     fseek вылетает #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.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,412
20.09.2009, 19:07     fseek вылетает #13
Давай полностью нерабочий код. Только не загромождай, самое неободимое.
Функция main, необходимые определения-вызовы, заголовочные файлы.
chelovechek
сишник
Автор FAQ
130 / 37 / 0
Регистрация: 25.07.2009
Сообщений: 291
20.09.2009, 19:26  [ТС]     fseek вылетает #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 минут
Все скомпилировалось без ошибок. Всем спасибо за помощь!
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,412
20.09.2009, 22:06     fseek вылетает #15
Ну и ещё один штрих ко всему этому. И вопрос к более опытным товарищам.
...Размышляя на лоне природы над бренностью всего сущего, я пришёл к выводу, что вообще-то функция file_load возвращает очень немаленький объём информации. Проще говоря, переменная типа file_info, объявленная в теле этой функции при возврате копируется.
Считаю, что целесообразно такого копирования избежать, сделав функцию file_load встроеной,
то есть, объявив её так:

C++
1
inline file_info file_load(FILE *f);
Я прав, друзья?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2009, 08:15     fseek вылетает
Еще ссылки по теме:

Fseek() для ifstream - C++
Знаю, что есть два вида открытия и закрытие файла. 1) Это чистый Си, когда: FILE * pf, * pr; pf = fopen(&quot;new1.txt&quot;, &quot;r&quot;); ...

Работа с файлами (fseek) - C++
В чем проблема и как ее устранить ? #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; #include &lt;stdio.h&gt; ...

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

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


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

Или воспользуйтесь поиском по форуму:
accept
4820 / 3240 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
21.09.2009, 08:15     fseek вылетает #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;
}
Yandex
Объявления
21.09.2009, 08:15     fseek вылетает
Ответ Создать тему
Опции темы

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