gpt4 book ai didi

c - 如何使用for循环从C中的文件中读取16个字节

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

我需要使用 for 循环读取每个 16 个字节(因为我需要单独加密每个 16 个字节的 block )它不起作用。无法弄清楚我在哪里遗漏了它:(

我的完整代码

typedef unsigned char BYTE;
FILE *fp;
BYTE buffer[16] = {0x00};
int i;
int lastBlock;
int main (int argc, char *argv[])
{
int x;
fp = fopen(argv[1], "r");
fseek(fp, 0, SEEK_END);
int fileSize = ftell(fp);
fseek(fp, 0, SEEK_SET);
lastBlock = fileSize - 16;
printf("FileSize %d \n", fileSize);
printf("Lastblcok %d \n", lastBlock);
for(x = 0; x < lastBlock; i+16){
fread(buffer, 1, 16, fp);
printf("%s\n", buffer);
}
return(0);
}

我的错误是什么?最后一个 block 变量很好。它打印出垃圾。它只是一个纯文本文件。

最佳答案

你的内部 2 个参数倒过来了。您正在尝试读取 16 个 block ,每个 block 1 个字节,而不是读取 1 个 16 字节的 block 。您也没有进行任何错误检查以确保 fread() 确实读取了您告诉它读取的所有内容。

关于您的循环限制变量 lastBlock,它没有被正确计算。如果文件是 100 字节长,而您希望以整个 16 字节的 block 读取它,您将读取 6 个 block (100/16)。您的计算 (100 - 16) 将尝试读取 84 个 block ,并在前 6 个 block 后惨败。

尝试更像这样的东西:

typedef unsigned char BYTE;

int main (int argc, char *argv[])
{
int x, numRead;
BYTE buffer[16];
FILE *fp = fopen(argv[1], "rb");
fseek(fp, 0, SEEK_END);
int fileSize = ftell(fp);
fseek(fp, 0, SEEK_SET);
printf("FileSize %d \n", fileSize);
for(x = 0; x < fileSize; x += 16) {
numRead = fread(buffer, 1, 16, fp);
if (numRead < 1) {
printf("error\n");
break;
}
if (numRead < 16) {
memset(&buffer[numRead], 0, 16-numRead);
}
printf("%.*s\n", numRead,buffer);
}
fclose(fp);
return(0);
}

关于c - 如何使用for循环从C中的文件中读取16个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19555706/

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