<?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;
}
#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;
}
Однако возвращает не всегда то что мне надо.
Я явно чего-то недопонимаю, тк вывод очень близок к желаемому результату. Прошу помочь в решении данной задачи.
register int c; замени на char и будет тебе счастье. Т.к. проблема скорее всего в том, что char, которые больше 127 отрицательный. (Имхо и лучшеб unsigned char юзал)
Цитата: arrjj
register int c; замени на char и будет тебе счастье. Т.к. проблема скорее всего в том, что char, которые больше 127 отрицательный. (Имхо и лучшеб unsigned char юзал)
К сожалению не помогло. Все по прежнему.
Если убрать вычитание 2L, то при поиске fseek вывод будет такой:
Код:
eek($f, $offset);
В то время как если искать fsize, вывод будет следующий:
Код:
$fsize = filesize($fname);
= 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;
}
#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 всё-таки необходимо заменить, иначе с кирилицей будут проблемы.
Программа выдаёт ровно то, что в ней написано. Функция 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);
long offset = offsetof(word, file);
char buff[100];
fseek(file, offset-strlen(word), SEEK_SET);
И ещё. Если в функции offsetof слово не найдено, то нужно просигнализировать об этом в вызывающую функцию, например, возвратом -1. А в main проверять это.
Цитата: koodeer
Переменная c должна быть типа int, тут всё верно. Так как функция fgetc возвращает тип int, а EOF равно -1.
...
...
тогда не long offsetof(char *string, FILE *input) а long offsetof(unsigned char *string, FILE *input) использовать
Опять сказалась моя невнимательность или отсутствие здорового сна.
Еще раз спасибо :)
Попробовал скомпилировать "нормальным" компилятором, до этого использовал 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
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;
}
#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;
}