输出文件中不需要的空格

Unwanted spaces in the output file

我正在尝试创建一个函数,在文本文件的从(包括)到(不包括)的每一行的末尾附加 !!。在我经历了几次并发症之后,我实际上成功了。但不完全是。


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] == '[=10=]') 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)填充文本文件。 我认为这是因为我还移动了 enzero-ed 附加区域 content

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

所以也许我需要弄清楚我必须使用什么合适的公式才能完成这项工作。 关于如何使这项工作有任何想法吗?

也许您可以在循环中再添加一个条件:

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 个字符并输入 '!!'就在这之后。

你的循环条件错误:

for(i = 0; i < fileSize; i++)

将内容附加到某些行后,最后一行的末尾移到 filesize 之后,因此将不再处理。

您使用 i[buffer] == '[=12=]' 测试是否已到达缓冲区的末尾,但这可能会导致在完成所有移位后读取超出缓冲区并且有 nio 更多尾随零。这不应该发生,因为首先检查结束行条件,但最好通过 calloc 再输入一个字符来确保安全,这将使 buffer 成为一个以零结尾的字符串。

当您移动的行数少于请求的行数时,因为文件中没有请求的行——假设您在一个 30 行的文件中移动了第 20 到 40 行——您仍然会打印出尾随零。您可以将以零终止的缓冲区打印为字符串,或者您应该跟踪附加的实际数据量。

您保留了两个冗余行数,linesln。选择一个并删除另一个;它只会不必要地混淆代码。