Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 尝试使用文件i/o读写查找两个文件不同的字节位置_C_File Io - Fatal编程技术网

C 尝试使用文件i/o读写查找两个文件不同的字节位置

C 尝试使用文件i/o读写查找两个文件不同的字节位置,c,file-io,C,File Io,我试图用读写命令来比较两个文件,找出它们的不同之处,从某种意义上讲,我脱离了一本书的例子,认为我的比较函数是正确的,但我显然没有,因为sprintf函数会打印出来。我最好的猜测是我是如何比较这两个文件的: (更新代码) 我现在在这里。如果(memcmp(buf1,buf2,len)!=0){,它就不会进入: void比较两个二进制文件(int f1,int f2) { //写(1,sprintf,10); ssize_t byte_read_f1,byte_read_f2,长度,numRead,

我试图用读写命令来比较两个文件,找出它们的不同之处,从某种意义上讲,我脱离了一本书的例子,认为我的比较函数是正确的,但我显然没有,因为sprintf函数会打印出来。我最好的猜测是我是如何比较这两个文件的:

(更新代码)

我现在在这里。如果(memcmp(buf1,buf2,len)!=0){,它就不会进入

void比较两个二进制文件(int f1,int f2)
{
//写(1,sprintf,10);
ssize_t byte_read_f1,byte_read_f2,长度,numRead,bob;
字符buf1[BUF_大小]、buf2[BUF_大小]、a[100]、b[100]、计数器[100];
int count=0,b_pos1,b_pos2,嘿;
而((字节读取=read(f1,buf1,sizeof buf1)>0)和&(字节读取=read(f2,buf2,sizeof buf2)>0)){

ssize_t len=byte_read_f1需要单独的缓冲区,并使用
memcmp
和/或循环来比较字节。
所有人都知道文件长度可能不同

// Untested code
char buf1[BUF_SIZE];
char buf2[BUF_SIZE];
while (((byte_read_f1 = read(f1, buf1, sizeof buf1)) > 0) && 
       ((byte_read_f2 = read(f2, buf2, sizeof buf2)) > 0)) {
  // find min length
  ssize_t len =  byte_read_f1 <byte_read_f2 ? byte_read_f1 : byte_read_f2;
  if (memcmp(buf1, buf2, len) != 0) {  // use memcmp for speed
    ssize_t i;
    for (i = 0; i<len; i++) {
      if (buf1[i] != buf2[i]) break;
    } 
    sprintf(counter, "Byte pos where two files differ is:%lld\n", (long long) count + i);
    sprintf(a, "Byte value of file 1: %hho\n", buf1[i]);
    sprintf(b, "Byte value of file 2: %hho\n", buf2[i]);
    break;
  }
  count += len;
  // If lengths differ
  if (byte_read_f1 != byte_read_f2) {
    sprintf(counter, "Byte pos where two files differ in length: %lld\n", (long long) count);
    // TBD code for a and b
    break;
    }
}
//未测试的代码
字符buf1[BUF_大小];
字符buf2[BUF_大小];
而((byte_read_f1=read(f1,buf1,sizeof buf1))>0)和
((字节_read_f2=read(f2,buf2,sizeof buf2))>0)){
//查找最小长度

ssize\u t len=byte\u read\u f1先读取
read
。1.您正在将两个文件中的n个字节读取到同一个缓冲区中--测试时,它们总是“相同的”.2.您正在比较读取的字节数。3.您无法使用
==
@Jongware来比较字符数组。如果您正在比较读取的字节数,则是因为后续的
memcmp()
还需要正确读取的缓冲区。请缩进代码consistently@chux:当然可以,但OP似乎也希望这样比较字节。OP:chux的意思是,如果
byte\u read\u f1!=byte\u read\u f2
,则不必进行比较——读取的字节数不同,因此文件在这一点上不同。@chux-所以循环的buf,buf部分很好,只是你说的memcmp()。@Chux或其他人-你能告诉我为什么write像我第一篇文章中那样工作,而不是将write语句放在if语句中吗?我仍然得到%lld,%hho,etc@OSU_2016不清楚您的请求。
read()
在一个
中,而在原始帖子和这个答案中都是
循环。
read()
不在
if()
语句中。@OSU\u 2016请显示您的代码“仍然获得%lld,%hho的输出”。@OSU\u 2016基于您最近的帖子,我已经更正了这个错误。
 void compare_two_binary_files(int f1, int f2)
 {
    ssize_t byte_read_f1, byte_read_f2, length, i;
    char buf1[BUF_SIZE], buf2[BUF_SIZE], a[BUF_SIZE], b[100], counter[100];
    int count = 0;
    while ((byte_read_f1 = read(f1, buf1, BUF_SIZE) > 0) && (byte_read_f2 = read(f2, buf2, BUF_SIZE) >0)){
            if (byte_read_f1 != byte_read_f2){
                    sprintf(counter, "Byte pos where two files differ is:%lld\n", (long long)  count + 1);
                    sprintf(a, "Byte value of file 1:  %o\n", buf1[i]);
                    sprintf(b, "Byte value of file 2: %o\n", buf2[i]);
                    write(1, counter, 100);
                    write(1, a, 100);
                    write(1, b, 100);
            }
            i++;
            count++;
    }
 }
 void compare_two_binary_files(int f1, int f2)
 {
    //write(1, sprintf, 10);
    ssize_t byte_read_f1, byte_read_f2, length, numRead, bob;
    char buf1[BUF_SIZE], buf2[BUF_SIZE], a[100], b[100], counter[100];
    int count = 0, b_pos1, b_pos2, hey;
    while ((byte_read_f1 = read(f1, buf1, sizeof buf1) > 0) && (byte_read_f2 = read(f2, buf2, sizeof buf2) >0)) {
            ssize_t len =  byte_read_f1 <byte_read_f2 ? byte_read_f1 : byte_read_f2;
            if (memcmp(buf1, buf2, len) != 0){
                    ssize_t i;
                    for (i = 0; i<len; i++){
                            if (buf1[i] != buf2[i]) break;
                    }
                    sprintf(counter, "Byte pos where two files differ is:%lld\n", (long long) count + i);
                    write(1, counter, 100);
                    sprintf(a, "Byte value of file 1: %hho\n", buf1[i]);
                    sprintf(b, "Byte value of file 2: %d\n", buf2[i]);
                    write(1, counter, 100);
                    write(1, b, 100);
                    write(1, a, 100);
                    break;
            }
            count += len;
    }
 }
// Untested code
char buf1[BUF_SIZE];
char buf2[BUF_SIZE];
while (((byte_read_f1 = read(f1, buf1, sizeof buf1)) > 0) && 
       ((byte_read_f2 = read(f2, buf2, sizeof buf2)) > 0)) {
  // find min length
  ssize_t len =  byte_read_f1 <byte_read_f2 ? byte_read_f1 : byte_read_f2;
  if (memcmp(buf1, buf2, len) != 0) {  // use memcmp for speed
    ssize_t i;
    for (i = 0; i<len; i++) {
      if (buf1[i] != buf2[i]) break;
    } 
    sprintf(counter, "Byte pos where two files differ is:%lld\n", (long long) count + i);
    sprintf(a, "Byte value of file 1: %hho\n", buf1[i]);
    sprintf(b, "Byte value of file 2: %hho\n", buf2[i]);
    break;
  }
  count += len;
  // If lengths differ
  if (byte_read_f1 != byte_read_f2) {
    sprintf(counter, "Byte pos where two files differ in length: %lld\n", (long long) count);
    // TBD code for a and b
    break;
    }
}