2

我正在尝试使用 read 函数读取位,但我不确定我应该如何使用缓冲区打印结果。

目前代码片段如下

 char *infile = argv[1];
 char *ptr = buff;
 int fd = open(infile, O_RDONLY); /* read only */
 assert(fd > -1);
 char n;
 while((n = read(fd, ptr, SIZE)) > 0){ /*loops that reads the file                                until it returns empty */
   printf(ptr);
 }
4

3 回答 3

1

读入的数据ptr可能包含\0字节、格式说明符并且不一定\0终止。不使用的所有充分理由printf(ptr)。反而:

// char n;
ssize_t n;
while((n = read(fd, ptr, SIZE)) > 0) { 
  ssize_t i;
  for (i = 0; i < n; i++) {
    printf(" %02hhX", ptr[i]);
    // On older compilers use --> printf(" %02X", (unsigned) ptr[i]);
  }
}
于 2013-09-24T15:44:01.813 回答
0

这是为您完成这项工作的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <assert.h>
#include <string.h>

#define SIZE        1024

int main(int argc, char* argv[])
{
    char *infile = "Text.txt";
    char ptrBuffer[SIZE];
    int fd = open(infile, O_RDONLY); /* read only */
    assert(fd > -1);
    int n;
    while((n = read(fd, ptrBuffer, SIZE)) > 0){ /*loops that reads the file                                until it returns empty */
        printf("%s", ptrBuffer);
        memset(ptrBuffer, 0, SIZE);
    }

    return 0;
}

您可以读取文件名作为参数。

于 2013-09-24T15:26:53.263 回答
0

即使ptr是字符串,也需要使用printf("%s", ptr);,而不是printf(ptr);

但是,在您致电后

read(fd, ptr, SIZE)

ptr很少是字符串(字符串需要以空值结尾)。您需要使用循环并选择所需的格式。例如:

for (int i = 0; i < n; i++)
    printf("%02X ", *ptr);
于 2013-09-24T15:28:24.983 回答