Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在I/O流中查找重复出现的字符串-C?_C_Realloc_Fseek_Ftell - Fatal编程技术网

在I/O流中查找重复出现的字符串-C?

在I/O流中查找重复出现的字符串-C?,c,realloc,fseek,ftell,C,Realloc,Fseek,Ftell,我是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

我是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;}  

非常感谢您提供的任何帮助

如果您只需对整个文件进行内存映射并在其上运行标准字符串搜索算法,这将非常容易

有关内存映射,请参见:


有关字符串搜索代码,请参见:

请检查注释已更新的行

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.update和check的第一个字符。

Ouch。我不知道你的具体问题是什么,但你已经让这件事变得比实际困难了3倍。考虑重新思考整个事情。为了教你如何钓鱼,而不是返回所有错误的1,你可以返回不同的值。这至少会告诉你函数的哪个部分出现了故障,也有助于我们复制我做错的地方——基本上就是所有的地方。