0
char *file1charbuf=(char*)malloc(sizeof(char));
char *file2charbuf=(char*)malloc(sizeof(char));

在循环中直到 EOF 我将 char 读入*file1charbuf然后*file2charbuf比较。

...
check=read(file1, file1charbuf, 1);
check2=read(file2, file2charbuf, 1);
if (*file1charbuf!=*file2charbuf){
         printf("differ: char %i, line %i\n",charpos,linepos);
         exit(1);
}
....

比较工作正常,但我想将指针保留在堆栈中,而不是堆中。malloc 也是 C lib 函数。

char *file1charbuf[1]; //1 element array of char
char *file2charbuf[1];

与那个比较不起作用

...
if (file1charbuf[0]!=file2charbuf[0]){
         printf("differ: char %i, line %i\n",charpos,linepos);
         exit(1);
}
...

和第二个问题。close(file1)如果exit(1)发现有必要吗?

  • 我应该只使用 sys 调用,而不是 lib 函数。
4

5 回答 5

5

恐怕您显示的代码存在很多问题:

  1. 不要malloc()在 C 中转换 ,的返回值。
  2. sizeof (char)在 C 中总是 1,所以像这样使用它是毫无意义的。
  3. 当您似乎指的是字符数组时,您正在声明指向字符的指针数组。

    char *file1charbuf[1]; //1 element array of char 应该
    char file1charbuf[1]; /* 1-element array of char */或者,当然,只是
    char file1charbuf; /* 1-character buffer. */

  4. 您正在read()使用 1 字节缓冲区,这是非常低效的。

  5. 要将字符数组(不一定是字符串,即不必以零结尾)与超过 1 个字符进行比较,请使用memcmp().
  6. 最好在调用close()之前调用所有打开的文件描述符exit()。在大多数操作系统上,进程的死亡将导致其所有资源被回收,但最好明确地这样做。如果文件 I/O 正在使用FILE*基于缓冲的调用,则没有必要,因为这些调用exit()在所有环境中都会自动关闭。
于 2013-04-20T11:12:57.887 回答
0

char *file1charbuf[1];是一个指向 a 的指针的数组char。如果您想要一个数组char,请使用char file1charbuf[1].

于 2013-04-20T11:13:11.570 回答
0

这些定义不是指向 char 数组的指针,它们是 char 数组。

char file1charbuf[1]; //1 element array of char
char file2charbuf[1];

使用在堆上分配的内存和在堆栈上分配的内存比较字符串的语义没有区别。

于 2013-04-20T11:16:55.620 回答
0
...
char c1, c2;
check=read(file1, &c1, 1);
check2=read(file2, &c2, 1);
if (c1!=c2) {
...
于 2013-04-20T19:13:29.700 回答
0

用于比较 2 个文件并列出不同的行和字符的代码。它不会逐行比较它们,而是逐个字符地比较它们,而是跟踪行号并将文件加载到 4Kbytes 的块中。

#define BLOCKSIZE 4096

char file1charbuf[BLOCKSIZE]; //4096 character buffer in stack
char file2charbuf[BLOCKSIZE];
int linepos=1, charpos =1, i, b1, b2 ;
int file1 = open("1.txt", O_RDONLY);
int file2 = open("2.txt", O_RDONLY);

do{
   b1=read(file1, file1charbuf, BLOCKSIZE);
   b2=read(file2, file2charbuf, BLOCKSIZE);
   for(i=0; i < b1 && i < b2; ++i){
      if (file1charbuf[i]!=file2charbuf[i]){
         printf("differ: char %i, line %i\n",charpos,linepos);
         close(file1);
         close(file2);
         exit(1);
      }
      if (file1charbuf[i] == '\n'){
         ++linepos;
         charpos=0;
      }
      ++charpos;
   }
}while(   (b1 == BLOCKSIZE || (file1==STDIN && file1charbuf[b1-1] != 0x26)) 
       && (b2 == BLOCKSIZE || (file2==STDIN && file2charbuf[b2-1] != 0x26)) );

if (b1 != b2)
   printf("One bigger than the other\n");
close(file1);
close(file2);

关于从 STDIN 读取:

当您按下回车键时,来自 stdin 的 read() 会解除阻塞。那时,只有您迄今为止键入的字符可供阅读。这意味着 b1 将等于您到目前为止键入的字符。条件将do-while失败,因为 read 没有读取它请求的所有 4096 字节,这将使它认为这是因为流已经结束。要在 \n 之后继续读取,我们必须更改 while 条件,以便如果我们正在读取的文件描述符是 STDIN,则继续读取,除非我们读取的最后一个字符是我认为的流结束字符0x26。我希望 ^D 也能像 enter 一样解除对 read() 的阻塞。

于 2013-04-21T10:40:47.540 回答