Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поиск смещения

65K
27 января 2011 года
spumer
6 / / 27.01.2011
Здравствуйте.
Есть файл над которым экспериментирую:
 
Код:
<?rororororororooror
fname = "./admins_simple.ini";
$f = fopen($fname, 'r');
$fsize = filesize($fname);
$data = fread($f, $fsize);
$offset = strpos($data, "TOP");
fseek($f, $offset);
echo fread($f, $fsize-$offset);
fclose($f);
?>

Встала задача нахождения точки первого входа слова в файле.
Попробовал реализовать таким образом:
Код:
#include <stdio.h>
#include <stdlib.h>

long offsetof(char *, FILE *);

void main(int argc, char *argv[]){
    FILE *file = fopen(argv[1], "r+");
    long offset = offsetof("fclose", file);
    char buff[100];
    fseek(file, offset-2L, SEEK_SET);
    fgets(buff, 100, file);
    puts(buff);
    fclose(file);
}

long offsetof(char *string, FILE *input){
    register int c;
    char *pString = string;
    while((c = fgetc(input)) != EOF){
        if(c == *pString)
            pString++;
        else pString = string;
        if(*pString == '\0')
            return ftell(input);
    }
    //return 0L;
}

Однако возвращает не всегда то что мне надо.
Я явно чего-то недопонимаю, тк вывод очень близок к желаемому результату. Прошу помочь в решении данной задачи.
277
27 января 2011 года
arrjj
1.7K / / 26.01.2011
register int c; замени на char и будет тебе счастье. Т.к. проблема скорее всего в том, что char, которые больше 127 отрицательный. (Имхо и лучшеб unsigned char юзал)
65K
27 января 2011 года
spumer
6 / / 27.01.2011
Цитата: arrjj
register int c; замени на char и будет тебе счастье. Т.к. проблема скорее всего в том, что char, которые больше 127 отрицательный. (Имхо и лучшеб unsigned char юзал)



К сожалению не помогло. Все по прежнему.
Если убрать вычитание 2L, то при поиске fseek вывод будет такой:

 
Код:
eek($f, $offset);

В то время как если искать fsize, вывод будет следующий:
 
Код:
$fsize = filesize($fname);
277
27 января 2011 года
arrjj
1.7K / / 26.01.2011
arrjj@arrjj-laptop:~/Загрузки$ ./qwe2 qwe2.txt fsize
= filesize($fname);

arrjj@arrjj-laptop:~/Загрузки$ ./qwe2 qwe2.txt fseek
($f, $offset);

arrjj@arrjj-laptop:~/Загрузки$ ./qwe2 qwe2.txt "f ="
fopen($fname, 'r');



Это без -2L Всё правильно ищет и правильно выдает.

Код:
#include <stdio.h>
#include <stdlib.h>

long offsetof(char *, FILE *);

int main(int argc, char *argv[]){
    FILE *file = fopen(argv[1], "r+");
    fseek(file,0,0);
    long offset = offsetof(argv[2], file);
    char buff[100];
    fseek(file, offset, 0);
    fgets(buff, 100, file);
    puts(buff);
    fclose(file);
    return 0;
}

long offsetof(char *string, FILE *input){
    register int c;
    char *pString = string;
    while((c = fgetc(input)) != EOF){
        if(c == *pString)
            pString++;
        else pString = string;
        if(*pString == '\0')
            return ftell(input);
    }
    return 0L;
}


register int на char всё-таки необходимо заменить, иначе с кирилицей будут проблемы.
297
27 января 2011 года
koodeer
1.2K / / 02.05.2009
Переменная c должна быть типа int, тут всё верно. Так как функция fgetc возвращает тип int, а EOF равно -1.


Программа выдаёт ровно то, что в ней написано. Функция offsetof находит конец переданного ей слова, а в main от этой позиции вычитается 2. Поэтому при поиске fclose выдаёт
se($f);
при поиске fsize
ze = filesize($fname);
при поиске fseek
ek($f, $offset);
Во всяком случае, у меня именно так. И так и должно быть.

Чтобы найти начало вхождения слова, нужно в main вычитать из offset длину слова, которое ищем:
 
Код:
char *word = "fsize";
long offset = offsetof(word, file);
char buff[100];
fseek(file, offset-strlen(word), SEEK_SET);



И ещё. Если в функции offsetof слово не найдено, то нужно просигнализировать об этом в вызывающую функцию, например, возвратом -1. А в main проверять это.
277
27 января 2011 года
arrjj
1.7K / / 26.01.2011
Цитата: koodeer
Переменная c должна быть типа int, тут всё верно. Так как функция fgetc возвращает тип int, а EOF равно -1.
...


тогда не long offsetof(char *string, FILE *input) а long offsetof(unsigned char *string, FILE *input) использовать

65K
27 января 2011 года
spumer
6 / / 27.01.2011
Спасибо за ответы, парни.
Опять сказалась моя невнимательность или отсутствие здорового сна.
Еще раз спасибо :)
Попробовал скомпилировать "нормальным" компилятором, до этого использовал MinGW.
lcc ругается так:
Код:
Error ../../c/read.c: 6  syntax error; found `int' expecting ')'
Error ../../c/read.c: 6  missing identifier
Error ../../c/read.c: 6  Syntax error; missing semicolon before  `int'
Error ../../c/read.c: 6  empty declaration
Error ../../c/read.c: 6  Syntax error; missing semicolon before  `)'
Error ../../c/read.c: 6  skipping `)'
Error ../../c/read.c: 6  unrecognized declaration
Warning ../../c/read.c: 6  no type specified. Defaulting to int
Error ../../c/read.c: 6  syntax error; found `unsigned' expecting ')'
Error ../../c/read.c: 6  syntax error; found `unsigned' expecting ')'
Error ../../c/read.c: 6  syntax error; found `unsigned' expecting ')'
Error ../../c/read.c: 6  missing identifier
Error ../../c/read.c: 6  Syntax error; missing semicolon before  `unsigned'
Error ../../c/read.c: 6  missing identifier
Error ../../c/read.c: 6  Syntax error; missing semicolon before  `)'
Error ../../c/read.c: 6  skipping `)'
Error ../../c/read.c: 6  unrecognized declaration
Error ../../c/read.c: 6  unrecognized declaration
Error ../../c/read.c: 6  unrecognized declaration
Error ../../c/read.c: 6  missing identifier
Error ../../c/read.c: 6  Syntax error; missing semicolon before  `)'
Error ../../c/read.c: 6  too many errors

tcc чуть меньше:
 
Код:
../read.c:6: ')' expected


Сам код на тек. момент:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


long offsetof(unsigned char *, FILE *);

void main(int argc, char *argv[]){
    FILE *file = fopen(argv[1], "r+");
    long offset = offsetof(argv[2], file);
    char buff[100];
    fseek(file, offset-strlen(argv[2]), SEEK_SET);
    fgets(buff, 100, file);
    puts(buff);
    fclose(file);
}

long offsetof(unsigned char *string, FILE *input){
    register int c;
    char *pString = string;
    while((c = fgetc(input)) != EOF){
        if(c == *pString)
            pString++;
        else pString = string;
        if(*pString == '\0')
            return ftell(input);
    }
    return 0L;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог