带二进制文件的C中的指针

带二进制文件的C中的指针,c,pointers,C,Pointers,我正在使用fread将文件内容读入char数组。但我不知道为什么输出中没有打印出来。代码如下: void getInfo(FILE* inputFile) { char chunk[4]; int liIndex; for (liIndex = 0 ; liIndex < 4 ; liIndex++) { fread(chunk, sizeof(char), 4, inputFile); } printf("\n chunk %s", chu

我正在使用fread将文件内容读入char数组。但我不知道为什么输出中没有打印出来。代码如下:

void getInfo(FILE* inputFile)
{
   char chunk[4];
   int liIndex;
   for (liIndex = 0 ; liIndex < 4 ; liIndex++)
   {
      fread(chunk, sizeof(char), 4, inputFile);
   }
   printf("\n chunk %s", chunk);
}
void getInfo(文件*inputFile)
{
字符块[4];
国际指数;
对于(liIndex=0;liIndex<4;liIndex++)
{
fread(chunk,sizeof(char),4,inputFile);
}
printf(“\n块%s”,块);
}
输出完全不打印任何内容。我哪里做错了

问候,,
darkie将
printf
移动到循环中。实际上,您只打印最后读取的块


编辑:显然,我读了问题,但没有读标题。你必须这样做,然后像托马斯说的那样切换到
fwrite

printf
移动到循环中。实际上,您只打印最后读取的块


编辑:显然,我读了问题,但没有读标题。你必须这样做,然后像托马斯说的那样切换到
fwrite

你不能使用
printf
打印二进制文件
printf
将二进制blob视为以null结尾的字符串,因此块中的任何
'\0'
字节都将结束“字符串”

要将区块完整写入标准输出,请使用
fwrite

fwrite(chunk, sizeof(char), 4, stdout);

不能使用
printf
打印二进制文件
printf
将二进制blob视为以null结尾的字符串,因此块中的任何
'\0'
字节都将结束“字符串”

要将区块完整写入标准输出,请使用
fwrite

fwrite(chunk, sizeof(char), 4, stdout);

在我看来,fread和fwrite只是增加了一层混乱

请尝试使用面向字节的输入和输出函数,因为4字节块并不比根本不使用块好多少,而且您不会在未编写的代码中出错

int ch; 
while ((ch = getc(inputFile)) != EOF)
   putchar(ch); 
但我认为真正的问题是你可能不完全理解你的要求。您正在读取二进制数据,然后尝试将其打印为字符数据;许多任意字节值与任何可打印字符都不对应。对于这些字节,您希望看到什么

信息量更大的方法可能是打印出每个字节的整数值以及它所代表的字符。这将使您清楚地看到文件中何时存在无法打印的字符

例如

当我在包含每个字节中一个字节的文件上运行此程序段时,很明显,许多值在解释为字符时没有任何意义:

[snip...]
29 ->
30 ->
31 ->
32 ->
33 -> !
34 -> "
35 -> #
36 -> $
37 -> %
38 -> &
39 -> '
[...more snipping]

在我看来,fread和fwrite只是增加了一层混乱

请尝试使用面向字节的输入和输出函数,因为4字节块并不比根本不使用块好多少,而且您不会在未编写的代码中出错

int ch; 
while ((ch = getc(inputFile)) != EOF)
   putchar(ch); 
但我认为真正的问题是你可能不完全理解你的要求。您正在读取二进制数据,然后尝试将其打印为字符数据;许多任意字节值与任何可打印字符都不对应。对于这些字节,您希望看到什么

信息量更大的方法可能是打印出每个字节的整数值以及它所代表的字符。这将使您清楚地看到文件中何时存在无法打印的字符

例如

当我在包含每个字节中一个字节的文件上运行此程序段时,很明显,许多值在解释为字符时没有任何意义:

[snip...]
29 ->
30 ->
31 ->
32 ->
33 -> !
34 -> "
35 -> #
36 -> $
37 -> %
38 -> &
39 -> '
[...more snipping]

稍微解构一下您的源代码:

void getInfo(FILE* inputFile) 
{ 
   char chunk[4]; 
   int liIndex; 
   for (liIndex = 0 ; liIndex < 4 ; liIndex++) 
   { 
      fread(chunk, sizeof(char), 4, inputFile); 
请记住,
%s
转换说明符期望相应的参数指向以0结尾的可打印字符序列,因此
chunk[0]
chunk[2]
需要可打印(即,
isprint(chunk[i])==1
),而chunk[3]最好始终为0,或者你可以得到一些奇怪的输出。由于在二进制文件中很少出现这种情况,您可能需要更改写入输出的方式

以下是如何将单个字节打印为整数值:

printf("chunk: ");
for (i = 0; i < sizeof chunk; i++)
  printf("%02x ", chunk[i];
putchar('\n');
printf(“块:”);
对于(i=0;i
稍微解构一下源代码:

void getInfo(FILE* inputFile) 
{ 
   char chunk[4]; 
   int liIndex; 
   for (liIndex = 0 ; liIndex < 4 ; liIndex++) 
   { 
      fread(chunk, sizeof(char), 4, inputFile); 
请记住,
%s
转换说明符期望相应的参数指向以0结尾的可打印字符序列,因此
chunk[0]
chunk[2]
需要可打印(即,
isprint(chunk[i])==1
)和chunk[3]最好始终为0,否则可能会得到一些奇怪的输出。由于二进制文件中很少出现这种情况,您可能需要更改写入该输出的方式

以下是如何将单个字节打印为整数值:

printf("chunk: ");
for (i = 0; i < sizeof chunk; i++)
  printf("%02x ", chunk[i];
putchar('\n');
printf(“块:”);
对于(i=0;i
您可以尝试:sizeof(chunk)代替fread()函数中的hadcoding“4”。您可以尝试:sizeof(chunk)代替fread()函数中的hadcoding“4”。您好,我问了一个愚蠢的问题。我使用了上面的语句并使用fprintf打印标准输出。但是仍然没有显示任何内容。很抱歉考验您的耐心。但是,您能告诉我哪里出了问题吗?当然,您可以使用printf打印二进制文件。问题在于%s格式。但是%d或%c可以正常工作,具体取决于关于darkie15期望二进制数据是什么样子的。嗨,我有一个愚蠢的问题。我使用上面的语句并使用fprintf打印标准输出。但是仍然没有显示任何内容。很抱歉测试您的耐心。但是您能告诉我我哪里出错了吗?当然,您可以使用printf打印二进制文件。问题在于%s但%d或%c可以正常工作,这取决于darkie15对二进制数据的期望。