Найти повторяющуюся строку в потоке ввода-вывода -C?
Я совершенно новичок в C. Я пытаюсь написать код, который находит строку в потоке ввода-вывода, и я не понимаю, что я делаю неправильно. Я знаю, что ошибка, вероятно, в большом цикле while (в коде ниже). Я хочу, чтобы функция возвращала местоположение в байтах от начала потока и -1, если по какой-то причине происходит сбой. Он просто возвращает -1 для любого файла, на котором я его пробую.
long find_string(const char *str, const char *filename, long offset)
{
FILE *f = fopen(filename, "r");
if (!f){
return -1;
}
int s=0,c;
c = fgetc(f);
if(c == EOF){
return -1;
}
char *check = malloc(sizeof(char));
fseek(f, 0L, SEEK_END); // Sees and stores how long the file is
long sz = ftell(f);
fseek(f, 0L, SEEK_SET);
if(fseek(f, offset,SEEK_SET) != 0){ // finds the position of offset
return -1;
}
while(fgetc(f) != EOF){
c = fgetc(f);
if(c == str[0] && ftell(f) < sz){
check[0] = c;
offset = ftell(f);
}
s++;
for (unsigned int r=1; r < (strlen(str));r++){
c = fgetc(f);
if(c == str[s]){
check = realloc(check, sizeof(char)*s);
check[s] = c;
s++;
}
}
if(strcmp(check, str)==0){
free(check);
fclose(f);
break;
}
else{
check = realloc(check, sizeof(char));
offset = -1;
}
}
return offset;}
Любая помощь с благодарностью
2 ответа
Это было бы намного проще, если бы вы просто отобразили в памяти весь файл и запустили на нем стандартный алгоритм поиска строк.
Для отображения памяти, см.: Linux - Memory Mapped File
Для кода поиска строки, смотрите: strstr () для строки, которая НЕ заканчивается на нуль
Пожалуйста, проверьте строки с обновленным комментарием
long find_string(const char *str, const char *filename, long offset)
{
FILE *f = fopen(filename, "r");
if (!f){
return -1;
}
int s=0,c;
c = fgetc(f);
if(c == EOF){
return -1;
}
char *check = malloc(sizeof(char));
fseek(f, 0L, SEEK_END); // Sees and stores how long the file is
long sz = ftell(f);
fseek(f, 0L, SEEK_SET);
if(fseek(f, offset,SEEK_SET) != 0){ // finds the position of offset
return -1;
}
c = fgetc(f); // Updated
while(c != EOF){ // Updated
if(c == str[0] && ftell(f) < sz){
check[0] = c;
offset = ftell(f);
}
s++;
for (unsigned int r=1; r < (strlen(str));r++){
c = fgetc(f);
if(c == str[s]){
check = realloc(check, sizeof(char)*s);
check[s] = c;
s++;
}
}
if(strcmp(check, str)==0){
free(check);
fclose(f);
break;
}
else{
check = realloc(check, sizeof(char));
offset = -1;
}
c = fgetc(f); //Updated
}
return offset;}
так как вы используете fgetc в условии и в начале просмотра, вы фактически сравниваете второй символ файла с первым символом строки str. обновить и проверить.