我目前正在尝试编写一个程序,一次读取一个字节的两个文件(是的,我知道 I/O 开销很大),但是我在递增 FILE 指针时遇到了问题。我想编程逐字节比较两个文件,getc 不是一个可行的选择,因为它只适用于字符,因为字符是一个字节。但是,我正在读取两个文本文件,文本文件可能包含整数、 double 等数字。因此,在这种情况下,我想从 int/double 的一部分中获取该字节并将其与另一个文件进行比较(逐字节顺序比较)。
这是我目前所拥有的:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <time.h>
#define BUFFER_SIZE 1
unsigned char buffer1[BUFFER_SIZE];
unsigned char buffer2[BUFFER_SIZE];
int main()
{
FILE *fp1, *fp2;
int ch1, ch2;
clock_t elapsed;
char fname1[40], fname2[40];
printf("Enter name of first file :");
fgets(fname1, 40, stdin);
while ( fname1[strlen(fname1) - 1] == '\n')
{
fname1[strlen(fname1) -1] = '\0';
}
printf("Enter name of second file:");
fgets(fname2, 40, stdin);
while ( fname2[strlen(fname2) - 1] == '\n')
{
fname2[strlen(fname2) -1] = '\0';
}
fp1 = fopen(fname1, "r");
if ( fp1 == NULL )
{
printf("Cannot open %s for reading\n", fname1 );
exit(1);
}
fp2 = fopen( fname2, "r");
if (fp2 == NULL)
{
printf("Cannot open %s for reading\n", fname2);
exit(1);
}
elapsed = clock(); // get starting time
/* Read in 256 8-bit numbers into the buffer */
size_t bytes_read1 = 0;
size_t bytes_read2 = 0;
bytes_read1 = fread(buffer1, sizeof(unsigned char), BUFFER_SIZE, fp1);
bytes_read2 = fread(buffer2, sizeof(unsigned char), BUFFER_SIZE, fp2);
printf("%c + in buffer 1\n", *buffer1);
printf("%c + in buffer 2\n", *buffer2);
fclose ( fp1 ); // close files
fclose ( fp2 );
elapsed = clock() - elapsed; // elapsed time
printf("That took %.4f seconds.\n", (float)elapsed/CLOCKS_PER_SEC);
return 0;
}
我假设 buffer1 和 buffer2 是正在读取的一个字节的内容?我是否必须将它们转换为数字才能进行比较?我在想我可以做如下比较
(buffer1 ^ buffer2) == 0
那么这将意味着基于 XOR 按位运算它们是相等的
提前感谢您的帮助
最佳答案
我喜欢评论中的玩笑。也许是时候举个例子了。
注意:在文本文件中,“a”等字母字符将被解释为“a”(97 或 0x61)。数字字符(例如“2”)将以相同方式解释为“2”(50 或 0x32)。文件只是字母数字、标点符号或空白字符的集合,使用 fgetc() 可以一次查看一个字符。
与您关于 fgetc() 不适用于逐字节比较的断言相反,这是一个简单的示例,表明它确实有效。显示使用 fgetc()
的代码以及相同 内容文件和不同 内容文件的输入和结果:
#include <ansi_c.h>//this is a collector of the ansi C headers. Pick the one in your
//environment that work for you.
#include <limits.h>
#define FILE1 "C:\\dev\\play\\file1.txt"
#define FILE2 "C:\\dev\\play\\file2.txt"
BOOL CompareFileByteByByte(char *file1, char *file2);
int main(void)
{
if(CompareFileByteByByte(FILE1, FILE2))
{
printf("Files are equal\n");
}
else
{
printf("Files are NOT equal\n");
}
return 0;
}
BOOL CompareFileByteByByte(char *file1, char *file2)
{
FILE *fp1=0, *fp2=0;
BOOL results = 0;
int c1 = 0, c2 = 0;//note, even though getc reads one char from file,
//it uses int as return to accomodate -1 (EOF)
fp1 = fopen(FILE1, "r");
fp2 = fopen(FILE2, "r");
c1 = fgetc(fp1);
c2 = fgetc(fp2);
results = (c1 == c2);
while((c1!=EOF) && (c2 != EOF) && results)
{
c1 = fgetc(fp1);
c2 = fgetc(fp2);
results = (c1 == c2);
}
return results;
}
给定 FILE1 FILE2:(两者相同)
Oringinal text...
...more text 123456
...more text 2.3456
...more text 3e12
结果:文件相等
给定 FILE1
Oringinal text...
...more text 123456
...more text 2.3456
...more text 3e12
和文件2
Oringinal text...
...more text 123456
...more text 2.3456
...more text 4e12
结果:文件不相等
关于c - 一次读取两个文件一个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24843635/