gpt4 book ai didi

c - 如何摆脱 "end of text"

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:19 25 4
gpt4 key购买 nike

我正在用 C 编写一个小程序来反转输入文件的内容并写入输出文件。

#include <stdio.h>
#include <stdlib.h>
#define BS 12

int main (const int argc, const char** argv)
{
if(argc != 3)
exit(-1);

unsigned char buffer[BS];
FILE * f1, * f2;
f1 = fopen(argv[1], "r");
f2 = fopen(argv[2], "w");

fseek(f1, 0, SEEK_END);

long i = 0, j = 0;
long f1_len = ftell(f1);
unsigned char tmp;

// while(i >= 0)
// {
for(i = ftell(f1), j = 0; i >= 0 && j <= BS - 1; i--, j++)
{
fseek(f1, i, SEEK_SET);
tmp = fgetc(f1);

if(i == f1_len || tmp == (unsigned char)0x03)
continue;
else
buffer[j] = tmp;
}
if(j == BS - 1)
fwrite(buffer, BS, 1, f2);
else
fwrite(buffer, j, 1, f2);

fflush(f2);
// }

fclose(f1);
fclose(f2);

return 0;
}

测试文件:

$ xxd testfile
0000000: 6162 6364 6566 670a abcdefg.

测试:

$ gcc test.c -o test
$ test testfile testfile2
$ xxd testfile2
0000000: 030a 6766 6564 6362 61 ..gfedcba

为什么会有'0x03'?我已经写了 tmp == (unsigned char)0x03 来摆脱那个字符,对吗?

最佳答案

当您使用 continue 时,字符 0x03 被跳过,但 j++ 仍会执行,因此缓冲区向前移动。

这意味着0x03实际上是未初始化的内存。

只需将 j++ 移动到循环的末尾,而不是在循环声明内。


侧节点:阅读你的代码我得到的印象是它可以在很多方面进行改进。也许你应该在 https://codereview.stackexchange.com/ 上询问当错误被修复时。

关于c - 如何摆脱 "end of text",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40304617/

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