C 相同的文件,相同的文件大小,但内存比较返回非零
我对C知之甚少的人说最后一个if块中的print语句应该被打印出来,但是它没有,你知道为什么吗 为了更加清晰,并向您展示完整的代码,我在if块之前添加了一个define语句和两个fread语句。分配的内存不是预先初始化的,因此其内容是随机的,因此几乎可以肯定这两个分配是不同的 预期的(从概率上说,“确定的”)结果正是所发生的 您是想在使用C 相同的文件,相同的文件大小,但内存比较返回非零,c,file-io,C,File Io,我对C知之甚少的人说最后一个if块中的print语句应该被打印出来,但是它没有,你知道为什么吗 为了更加清晰,并向您展示完整的代码,我在if块之前添加了一个define语句和两个fread语句。分配的内存不是预先初始化的,因此其内容是随机的,因此几乎可以肯定这两个分配是不同的 预期的(从概率上说,“确定的”)结果正是所发生的 您是想在使用memcmp进行测试之前将文件加载到这两个缓冲区中,但忘记了这样做吗?分配给的内存不是预先初始化的,因此其内容是随机的,因此几乎可以肯定这两个分配是不同的 预期
memcmp
进行测试之前将文件加载到这两个缓冲区中,但忘记了这样做吗?分配给的内存不是预先初始化的,因此其内容是随机的,因此几乎可以肯定这两个分配是不同的
预期的(从概率上说,“确定的”)结果正是所发生的
您是否打算在使用
memcmp
进行测试之前将文件加载到这两个缓冲区中,但忘记了这样做?请考虑以下几点:1.
long int
的返回类型,因此最好将fileSize
声明为long int
(。在malloc
中使用时,您也可以去掉sizeof(char)
。3.在第一次调用
fread
后,文件流指针按fileSize
指定的文件大小前进。因此,紧随其后的第二次fread
将无法读取任何内容(假设第一次调用成功)。这就是您看到程序中提到的行为的原因。在第二次调用fread
之前,您需要使用revend
重置文件流指针。您还可以检查fread
的返回值,该值是成功读取的字节数,以检查实际读取成功的字节数完全正确。尝试以下几行:
#define "/local/home/..."
FILE *fp;
short *originalUnPacked;
short *unPacked;
int fileSize;
fp = fopen(FILENAME, "r");
fseek (fp , 0 , SEEK_END);
fileSize = ftell (fp);
rewind (fp);
originalUnPacked = (short*) malloc (sizeof(char)*fileSize);
unPacked = (short*) malloc (sizeof(char)*fileSize);
fread(unPacked, 1, fileSize, fp);
fread(originalUnPacked, 1, fileSize, fp);
if( memcmp( unPacked, originalUnPacked, fileSize) == 0)
{
print (" unpacked and original unpacked equal ") // Not happens
}
4.最好检查fopen
,malloc
等的返回值,以防出现故障,即NULL
在fopen
和malloc
的情况下进行检查希望这有帮助!请考虑以下几点:
1.
long int
的返回类型,因此最好将fileSize
声明为long int
(。在malloc
中使用时,您也可能会去掉sizeof(char)
。3.在第一次调用
fread
后,文件流指针按fileSize
指定的文件大小前进。因此,紧随其后的第二次fread
将无法读取任何内容(假设第一次调用成功)。这就是您看到程序中提到的行为的原因。在第二次调用fread
之前,您需要使用revend
重置文件流指针。您还可以检查fread
的返回值,该值是成功读取的字节数,以检查实际读取成功的字节数完全正确。尝试以下几行:
#define "/local/home/..."
FILE *fp;
short *originalUnPacked;
short *unPacked;
int fileSize;
fp = fopen(FILENAME, "r");
fseek (fp , 0 , SEEK_END);
fileSize = ftell (fp);
rewind (fp);
originalUnPacked = (short*) malloc (sizeof(char)*fileSize);
unPacked = (short*) malloc (sizeof(char)*fileSize);
fread(unPacked, 1, fileSize, fp);
fread(originalUnPacked, 1, fileSize, fp);
if( memcmp( unPacked, originalUnPacked, fileSize) == 0)
{
print (" unpacked and original unpacked equal ") // Not happens
}
4.最好检查fopen
,malloc
等的返回值,以防出现故障,即NULL
在fopen
和malloc
的情况下进行检查希望这有帮助!您在哪里将这两个文件加载到由
originalUnPacked
和unPacked
指向的内存中?始终检查返回值。如果malloc
成功,也不检查fopen
,fread
,fseek
或ftell
成功,请告诉我们是否成功t仍在这样做。您将这两个文件加载到由originalUnPacked
和unPacked
指向的内存中的什么位置?始终检查返回值。如果malloc
成功,您不会检查fopen
,fread
,fseek
或ftell
是否成功,然后告诉我们是否成功他还在这样做。