0

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

我的完整代码

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);
}

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

4

3 回答 3

4

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

关于您的循环限制变量lastBlock,它的计算不正确。如果文件长度为 100 字节,并且您只想读取整个 16 字节的块那么您将读取 6 个块 ( 100/16)。您的计算 ( 100 - 16) 将尝试读取 84 个块,并在前 6 个块之后惨遭失败。

尝试更多类似的东西:

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);
}
于 2013-10-24T02:19:00.563 回答
1

这段代码有两个潜在的问题:

1)您没有检查读取失败的错误状态

2)你没有终止字符串

建议:

char buffer[17];
...
for(x = 0;  x < lastBlock; x++){
    /* int fread(void *ptr, size_t size, size_t nitems, FILE *stream); */
    if ((err = fread(buffer, 16, 1, fp)) < 0) {
      perror ("Read error!\n");
    }
    else {
      buffer[16] = '\0';
      printf("%s\n", buffer);   
    }     
}
于 2013-10-24T02:19:20.587 回答
0

“最后一个块变量很好。它打印出垃圾。”

垃圾,因为:

fread函数只会读取一些元素,它不会以空字符终止字符串

您可以自己添加 NULL ( '\0') 终止符,也可以使用fgets/fscanf代替。

于 2013-10-24T02:18:52.893 回答