gpt4 book ai didi

c - 输出文件中不需要的空格

转载 作者:太空宇宙 更新时间:2023-11-04 02:40:43 25 4
gpt4 key购买 nike

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


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

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

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

最佳答案

你的循环条件是错误的:

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

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

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

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

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

关于c - 输出文件中不需要的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32164079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com