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

fseek / fread - C++

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

Такой вопрос возник. Есть строка, состоящая из нескольких "записей" в файле (буквы + числа). Нужно с помощью функций 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 один вопрос: если после применения этой функции я снова открою этот файл, где конкретно будет находиться указатель?

Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2011, 22:20     fseek / fread
Посмотрите здесь:

fseek вылетает C++
работа с fseek и файлами C++
Функция fseek C++
C++ Работа с файлами (fseek)
fseek не работает C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
09.12.2011, 22:47     fseek / fread #2
amfisat, конечно ошибка. Не знаю, что вам надо, но попробую угадать
C
1
fseek(f,sizeof(name),SEEK_SET);
Добавлено через 59 секунд
Цитата Сообщение от amfisat Посмотреть сообщение
каким образом char привести к этому типу и корректно использовать.
А char приводить не надо, можно так использовать. А вот char * надо
amfisat
 Аватар для amfisat
67 / 67 / 1
Регистрация: 16.06.2009
Сообщений: 235
10.12.2011, 12:08  [ТС]     fseek / fread #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);
}
- но выдается пустая строка.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
10.12.2011, 16:50     fseek / fread #4
Цитата Сообщение от amfisat Посмотреть сообщение
char *mas;
Это всего лишь указатель, вы должны выделить память и присвоить адрес ее этому указателю.

Добавлено через 24 секунды
Потом только считывать из файла
-=ЮрА=-
Заблокирован
Автор FAQ
10.12.2011, 17:01     fseek / fread #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", которую ты тоже должен в функцию передать.
Yandex
Объявления
10.12.2011, 17:01     fseek / fread
Ответ Создать тему
Опции темы

Текущее время: 06:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru