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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
amfisat
67 / 67 / 1
Регистрация: 16.06.2009
Сообщений: 240
#1

fseek / fread - C++

09.12.2011, 22:20. Просмотров 1392. Ответов 4
Метки нет (Все метки)

Всем привет!

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

Например, в файле есть: aaa123bbb456ccc789
Здесь 3 записи: aaa123, bbb456, ccc789 с именами (соответственно): aaa, bbb, ccc. Применяю функцию: Found(fname, "ccc") и в массив должно записаться: ccc789.

Делаю так:
C++
1
2
3
4
5
6
7
8
void Found (char *fname, char *name)
{
    FILE* f = fopen (fname, "rb"); 
    char *ind;
    fseek(f,name,SEEK_SET); //а вот здесь ошибка
    fread(&ind, sizeof(ind), 1, f);
    fclose (f);
}
Почему не работает? - я понимаю, что name должно быть типа long, но не понимаю, каким образом char привести к этому типу и корректно использовать.

И попутно хочу сразу задать ещё 1 один вопрос: если после применения этой функции я снова открою этот файл, где конкретно будет находиться указатель?

Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2011, 22:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос fseek / fread (C++):

fseek вылетает - C++
#include <stdio.h> #include <windows.h> char *filename; long size; File *in; char *infile; int main(int argc, char *argv) { ...

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

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

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

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

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

4
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
09.12.2011, 22:47 #2
amfisat, конечно ошибка. Не знаю, что вам надо, но попробую угадать
C
1
fseek(f,sizeof(name),SEEK_SET);
Добавлено через 59 секунд
Цитата Сообщение от amfisat Посмотреть сообщение
каким образом char привести к этому типу и корректно использовать.
А char приводить не надо, можно так использовать. А вот char * надо
0
amfisat
67 / 67 / 1
Регистрация: 16.06.2009
Сообщений: 240
10.12.2011, 12:08  [ТС] #3
Цитата Сообщение от go Посмотреть сообщение
amfisat, конечно ошибка. Не знаю, что вам надо, но попробую угадать
C
1
fseek(f,sizeof(name),SEEK_SET);
Не знаю, по-моему, не работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <conio.h>
void Found (char *fname, char *name)
{
        FILE* f = fopen (fname, "rb"); 
        char *mas;
        fseek(f,sizeof(name),SEEK_SET); //а вот здесь ошибка
        fread(&mas, sizeof(mas), 1, f);
        fclose (f);
}
int main()
{
    Found("example.txt", (long int)("aaa"));
    return 0;
}
В файле содержится: aaa123bbb456ccc789, и в массив должно записаться: aaa123. Смотрю, что в массиве:
C
1
2
3
4
5
...
fread(&mas, sizeof(mas), 1, f);
printf("%c\n", mas);
fclose (f);
}
- но выдается пустая строка.
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
10.12.2011, 16:50 #4
Цитата Сообщение от amfisat Посмотреть сообщение
char *mas;
Это всего лишь указатель, вы должны выделить память и присвоить адрес ее этому указателю.

Добавлено через 24 секунды
Потом только считывать из файла
0
-=ЮрА=-
Заблокирован
Автор FAQ
10.12.2011, 17:01 #5
amfisat, не работает потому что реализация крайне неудачная, даавай посмотри что надо - найти строку в файле(её может и не быть + строк всегда много), ну как минимум это делается в цикле, ладно предположим мы позиционируем файловый поток снаружи ну ладно так можно, тогда мы должны считать "слово"
Цитата Сообщение от amfisat Посмотреть сообщение
fread(&ind, sizeof(ind), 1, f);
- что это за хр*нь???Она ничего тебе не считает, во первых - длинну строки ты не знаешь значит - вначале запомни текущую позицию Pos = ftell(f) подсчитай число символов до следующего пробела, узнай текущую позицию curPos, отставь курсор обратно на pos, при этом выдели память под свою ind = (char *)malloc((curPos - Pos)*sizeof(char)); а уж потом считай fread-ом эту строку fread(ind,1,(curPos - Pos)*sizeof(char),f); и сравнивай со своей строкой "ccc", которую ты тоже должен в функцию передать.
0
10.12.2011, 17:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2011, 17:01
Привет! Вот еще темы с ответами:

Работа с файлами (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 для того чтобы создавать большие файлы, потому что функция...


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

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

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