如何使用Unix C检查一个文件是否与另一个文件相同(内容相同)?我的意思是,当我无法使用fopen, fread, fclose
而只是open, read, close
时?我对答案表示感兴趣,这些答案显示了如何在Unix C中完成此任务。
我写了一个程序,将一个文件复制到另一个文件,但不知道如何检查它们是否相同:/:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
const char *in_filename = "in.txt", *out_filename = "out.txt";
int in_fd, out_fd, bytes_read, bytes_written;
int buffsize = 512;
char buffer[512];
int success = 0;
in_fd = open(in_filename, O_RDONLY);
if (in_fd == -1)
return -1;
out_fd = open(out_filename, O_WRONLY | O_APPEND, S_IRUSR | S_IWUSR);
if (out_fd == -1)
return -1;
for(;;)
{
bytes_read = read(in_fd, buffer, buffsize);
if (bytes_read > 0)
{
bytes_written = write(out_fd, buffer, bytes_read);
if(bytes_written < 0)
return -1;
}
else
{
if (bytes_read == 0)
{
if (close(in_fd) < 0)
return -1;
if (close(out_fd) < 0)
return -1;
success = 1;
break;
}
else if (bytes_read == -1)
{
break;
return -1;
}
}
}
if(success)
fprintf(stdout, "%s", "Success!\n");
return 0;
}
继承我尝试的内容:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
const char *in_filename = "in.txt", *out_filename = "out.txt";
int in_fd, out_fd, bytes_read_in, bytes_read_out;
int buffsize = 512;
char in_buffer[512], out_buffer[512];
int the_same = 0;
in_fd = open(in_filename, O_RDONLY);
if (in_fd == -1)
return -1;
out_fd = open(out_filename, O_RDONLY);
if (out_fd == -1)
return -1;
for(;;)
{
bytes_read_in = read(in_fd, in_buffer, buffsize);
if (bytes_read_in > 0)
{
bytes_read_out = read(out_fd, out_buffer, buffsize);
if(bytes_read_out > 0)
{
int i = 0;
for(i=0; i<buffsize; i++)
{
if(in_buffer[i] != out_buffer[i])
the_same = 0;
}
the_same = 1;
}
}
else
{
if (bytes_read_in == 0)
{
if (close(in_fd) < 0)
return -1;
if (close(out_fd) < 0)
return -1;
break;
}
else if (bytes_read_in == -1)
{
break;
return -1;
}
}
}
if(the_same)
fprintf(stdout, "%s", "Files are the same!\n");
return 0;
}
但它显示文件是相同的,而不是:(
答案 0 :(得分:3)
您只需要同时读取两个缓冲区。例如(也就是说,考虑处理错误),根本不使用C标准库:
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#define BUFFER_SIZE 1024
static int
bufcmp(const void *p, const void *q, size_t n)
{
const char *p1 = p;
const char *p2 = q;
while (n-- > 0) {
if (*p1++ != *p2++)
return 0;
}
return 1;
}
int
main(int argc, char *argv[])
{
int fd1 = open(argv[1], O_RDONLY);
int fd2 = open(argv[2], O_RDONLY);
int same = 1;
for (;;) {
char buf1[BUFFER_SIZE], buf2[BUFFER_SIZE];
ssize_t n1 = read(fd1, buf1, BUFFER_SIZE);
ssize_t n2 = read(fd2, buf2, BUFFER_SIZE);
if (n1 < n2) {
same = 0;
break;
} else if (n1 == 0) {
break;
} else if (bufcmp(buf1, buf2, n1) == 0) {
same = 0;
break;
}
}
if (same)
write(STDOUT_FILENO, "Same content.\n", 14);
close(fd1);
close(fd2);
return 0;
}
NB(感谢user4815162342):此代码并非完全正确。实际上,如果read
返回的读取字节数小于请求的字节数,则不会出错。但是,为了缩短此代码,我没有包含此管理。
答案 1 :(得分:1)
使用两个缓冲区有什么问题,每个文件一个缓冲区,每个文件读取相同数量的字节,然后将缓冲区内容与memcmp
进行比较?