С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
сишник
Автор FAQ
130 / 36 / 1
Регистрация: 25.07.2009
Сообщений: 291

fseek вылетает

19.09.2009, 14:00. Показов 2679. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.09.2009, 14:00
Ответы с готовыми решениями:

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

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

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

15
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
19.09.2009, 15:22
chelovechek, почему ты не проверяешь, что у тебя in вообще рабочий? Может, у тебя вообще файл не открылся. Может, FILE?
1
сишник
Автор FAQ
130 / 36 / 1
Регистрация: 25.07.2009
Сообщений: 291
19.09.2009, 15:27  [ТС]
В программе FILE *.
Получается, try ... catch с fileopen не ловят. А так да, in пустой.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
19.09.2009, 15:34
chelovechek, а почему try должен ловить fileopen? Это что, исключение? Файла, например, нет на диске. Или на его открытие нет прав. Это нормальная ситуация, а не исключительная. try тут не при чем.
0
 Аватар для RazorQ
591 / 357 / 16
Регистрация: 06.02.2009
Сообщений: 1,386
19.09.2009, 16:29
chelovechek, проверяй так
C
1
2
if((in = fopen(filename, "rd")) == NULL)
/* файл не открылся */
0
сишник
Автор FAQ
130 / 36 / 1
Регистрация: 25.07.2009
Сообщений: 291
19.09.2009, 17:17  [ТС]
теперь вылетает 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
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
19.09.2009, 17:32
А память кто будет выделять для picname?
1
сишник
Автор FAQ
130 / 36 / 1
Регистрация: 25.07.2009
Сообщений: 291
19.09.2009, 17:46  [ТС]
Опять проблема с 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
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
20.09.2009, 09:27
C99 7.19.9.2
Code
1
2
3
4
5
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
сишник
Автор FAQ
130 / 36 / 1
Регистрация: 25.07.2009
Сообщений: 291
20.09.2009, 14:39  [ТС]
Решил пойти другим путем, загружая файл через 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
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
20.09.2009, 18:09
Это верный путь. Как и другие, кстати.
Значит, первое
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
сишник
Автор FAQ
130 / 36 / 1
Регистрация: 25.07.2009
Сообщений: 291
20.09.2009, 18:34  [ТС]
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
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
20.09.2009, 19:07
Давай полностью нерабочий код. Только не загромождай, самое неободимое.
Функция main, необходимые определения-вызовы, заголовочные файлы.
0
сишник
Автор FAQ
130 / 36 / 1
Регистрация: 25.07.2009
Сообщений: 291
20.09.2009, 19:26  [ТС]
Чтение работает, но возникла следующая проблема:
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
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
20.09.2009, 22:06
Ну и ещё один штрих ко всему этому. И вопрос к более опытным товарищам.
...Размышляя на лоне природы над бренностью всего сущего, я пришёл к выводу, что вообще-то функция file_load возвращает очень немаленький объём информации. Проще говоря, переменная типа file_info, объявленная в теле этой функции при возврате копируется.
Считаю, что целесообразно такого копирования избежать, сделав функцию file_load встроеной,
то есть, объявив её так:

C++
1
inline file_info file_load(FILE *f);
Я прав, друзья?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
21.09.2009, 08:15
есть ещё метод 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.09.2009, 08:15
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Изучаю 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
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru