0

我对 C 很陌生。我正在尝试编写一个在 I/O 流中查找字符串的代码,但我不明白我做错了什么。我知道错误可能在大的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;}  

任何帮助是极大的赞赏

4

2 回答 2

0

如果您简单地对整个文件进行内存映射并在其上运行标准字符串搜索算法,这会容易得多。

有关内存映射,请参阅:Linux - 内存映射文件

对于字符串搜索代码,请参阅:strstr() 以获取非空终止的字符串

于 2014-04-22T12:34:49.857 回答
0

请检查更新评论的行

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 的第一个字符进行了比较。更新和检查。

于 2014-04-22T12:37:20.783 回答