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

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

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

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

19.09.2009, 14:00. Просмотров 1582. Ответов 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 вылетает (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Vourhey
Почетный модератор
6481 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
19.09.2009, 15:22 #2
chelovechek, почему ты не проверяешь, что у тебя in вообще рабочий? Может, у тебя вообще файл не открылся. Может, FILE?
1
chelovechek
сишник
Автор FAQ
130 / 37 / 0
Регистрация: 25.07.2009
Сообщений: 291
19.09.2009, 15:27  [ТС] #3
В программе FILE *.
Получается, try ... catch с fileopen не ловят. А так да, in пустой.
0
Vourhey
Почетный модератор
6481 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
19.09.2009, 15:34 #4
chelovechek, а почему try должен ловить fileopen? Это что, исключение? Файла, например, нет на диске. Или на его открытие нет прав. Это нормальная ситуация, а не исключительная. try тут не при чем.
0
RazorQ
577 / 344 / 9
Регистрация: 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 / 0
Регистрация: 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
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
19.09.2009, 17:32 #7
А память кто будет выделять для picname?
1
chelovechek
сишник
Автор FAQ
130 / 37 / 0
Регистрация: 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
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
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 / 0
Регистрация: 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
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
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 / 0
Регистрация: 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
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
20.09.2009, 19:07 #13
Давай полностью нерабочий код. Только не загромождай, самое неободимое.
Функция main, необходимые определения-вызовы, заголовочные файлы.
0
chelovechek
сишник
Автор FAQ
130 / 37 / 0
Регистрация: 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
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,459
20.09.2009, 22:06 #15
Ну и ещё один штрих ко всему этому. И вопрос к более опытным товарищам.
...Размышляя на лоне природы над бренностью всего сущего, я пришёл к выводу, что вообще-то функция file_load возвращает очень немаленький объём информации. Проще говоря, переменная типа file_info, объявленная в теле этой функции при возврате копируется.
Считаю, что целесообразно такого копирования избежать, сделав функцию file_load встроеной,
то есть, объявив её так:

C++
1
inline file_info file_load(FILE *f);
Я прав, друзья?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2009, 22:06
Привет! Вот еще темы с ответами:

Работа с файлами (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? - C++
Что делает fseek и зачем он нужен? fseek(firstFile,0,SEEK_SET); fseek(secondFile,0,SEEK_SET);

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
20.09.2009, 22:06
Ответ Создать тему
Опции темы

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