1

!!テキストファイルの(含む)から(含まない)までの各行の最後に追加する関数を作成しようとしています。いくつかの複雑な問題を抱えた後、実際に成功しました。しかし、完全ではありません。


int incldue_auto (char *script, unsigned int offsetLine, unsigned int endLine)
{
    size_t  fileSize;
    size_t  content = (endLine - offsetLine) * 3; // New characters
    char    *buffer;
    FILE*   fp;

    if((fp = fopen(script, "r")) == NULL)                               //return(1);
    if(fseek(fp, 0l, SEEK_END) != 0)                                    //return(2);
    if((fileSize = ftell(fp)) == (-1l))                                 //return(3);
    if(fseek(fp, 0l, SEEK_SET) != 0)                                    //return(2);
    if((buffer = calloc(fileSize + content, sizeof(char))) == NULL)     //return(4);
    if(fread(buffer, sizeof(char), fileSize, fp) != fileSize)           //return(5);
    if(fclose(fp) == EOF)                                               //return(6);
    {
        int i, i2;
        int lines = 0, ln = 0;
        for(i = 0; i < fileSize; i++)
        {
            if(ln >= (endLine - offsetLine) || i[buffer] == '\0') break;
            if(i[buffer] == '\n')
            {
                lines++;

                if(lines >= offsetLine && lines < endLine)
                {
                    char* p = (buffer + i); // \n

                    //if(*(p - 1) == '\n') continue;

                    memmove(p + 3,
                            p,
                            strlen(p)); // <-- Problematic line (I think)

                    memcpy(p, " !!", 3);

                    i += 3;
                    ln++;
                }
            }
        }

        fp = fopen(script, "w");
        fwrite(buffer, fileSize + content, sizeof(char), fp);
        fclose(fp);
    }
    free(buffer);
    return 0;
}

最後の行に追加されないことを除いて、比較的うまく機能します。そして、テキスト ファイルの最後にスペース (おそらく NULL) を入力します。私はそれでゼロ化された追加領域も移動しているためだと思いますcontent

memmove(p + 3,
        p,
        strlen(p)); // <-- Problematic line (I think)

ここに画像の説明を入力 したがって、これを機能させるために使用する必要がある適切な式は何かを理解する必要があるかもしれません。これを機能させる方法のアイデアはありますか?

4

2 に答える 2

0

たぶん、ループにもう 1 つの条件を入れることができます。

if(lines >= offsetLine && lines < endLine)
{
    ...//your code here before 'memcpy(p, " !!", 3);'
    if(lines==endline)
    {
        memmove(p + 3, p, strlen(p));    
    }
    //the end of your code here:
    memcpy(p, " !!", 3);//your code here
    i += 3;
    ln++;
}

これが最後の行である場合は、さらに 3 文字移動して「!!」を入力します。この直後。

于 2015-08-23T08:00:55.300 に答える