我正在尝试创建一个函数,该函数在文本文件的(包含) - (独占)的每一行的末尾附加!!
。在我有几个并发症后,我实际上成功了。但并非完全如此。
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)。 我认为这是因为我还在使用以下内容{+ 1}}进行加密:{/ 1>
content
答案 0 :(得分:2)
您的循环条件错误:
for(i = 0; i < fileSize; i++)
将内容添加到某些行后,最后一行的末尾移动到filesize
以上,因此将不再处理。
您测试是否已使用i[buffer] == '\0'
到达缓冲区的末尾,但是在完成所有轮班之后可能会导致读取超出缓冲区,并且有更多的尾随零。这不应该发生,因为首先检查结束行条件,但最好calloc
再多一个char,这将使buffer
成为以零结尾的字符串。
当您移动的线数少于请求的数量时,因为文件没有请求的行 - 比如说在30行文件中将第20行移到40行 - 您仍然会打印出尾随的零。您可以将零终止缓冲区打印为字符串,也可以跟踪实际附加的数据量。
您保留两个冗余行数lines
和ln
。选择一个并删除另一个;它只会不必要地混淆代码。
答案 1 :(得分:0)
也许你可以在循环中再添加一个条件:
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个字符并放置&#39; !!&#39;就在这之后。