1

我正在尝试接收一个充满 4 字节二进制整数的文件。我read()在打开这个文件后尝试使用,但根本无法弄清楚这个功能。我不知道如何格式化我的代码,我几乎找不到我正在尝试做的这种特定类型的事情的代码示例。我想读取一个充满整数的二进制文件,然后以 ASCII 格式打印每个整数。在编写代码之前,我也希望能够在不知道二进制 int 的确切数量的情况下做到这一点。我一直在修改/尝试的一些片段是这样的,但我也不知道如何将这样的东西实现到循环中。

char *infile = argv[1];
int fd = open(infile, O_RDONLY);

   int value;
   int rc = read(fd, &value, sizeof(int));
   printf("%d", value);
4

3 回答 3

2

调用read将返回读取的字节数,因此您可以简单地继续操作,直到获得请求大小以外的其他内容,例如:

ssize_t rc = read (fd, &value, sizeof value);
while (rc == sizeof value) {
    printf ("%d\n", value);
    rc = read (fd, &value, sizeof value);
}
if (rc == 0) {
    printf ("End of file reached okay\n");
} else if (rc < 0) {
    printf ("Some sort of error, errno = %d\n", errno);
} else {
    printf ("Only %d/%d bytes read\n", rc, sizeof value);
}

如您所见,从中收到的最终值read决定了发生了什么。-1表示某种错误,0表示已到达文件末尾,并且任何其他值(当然除了四个)都表示部分读取,可能是因为文件未正确创建。

您可能还想重新考虑使用低级 I/O 函数openread除非您有非常特殊的需要,否则它们实际上并不是 ISO C 标准的一部分,您可以使用fopenandfread流实现相同的目的- 基于函数。

于 2013-09-25T07:23:34.380 回答
0

read 函数返回实际读取了多少字节,如果发生错误则返回-1,如果到达文件末尾则返回0,因此即使您不知道有多少字节,您也可以使用它来读取所有整数。

所以使用读取,你的代码可能是这样的:

char *infile = argv[1];
int fd = open(infile, O_RDONLY);

int value;
int rc;
while ((rc = read(fd, &value, sizeof(int)) > 0) {
    printf("%d\n", value);
}

使用 fopen/fread(推荐):

char *infile = argv[1];
FILE *fp = fopen(infile, "r");

int value;
int rc;
while ((rc = fread(&value, sizeof(int), 1, fp) > 0) {
    printf("%d\n", value);
}

请注意,fread与 略有不同read,第二个参数是每个值的大小,第三个参数是要读取多少个值。它将返回它实际读取的值(不是字节)(在这种情况下,当有要读取的值时为 1)。

值得一提的另一件事是,您说您要读取 4 个字节的值。Int 在大多数现代平台中是 4 个字节,但没有保证,如果您想确保它始终是 4 个字节,请包含标头<stdint.h>并使用int32_t.

于 2013-09-25T07:33:48.210 回答
0

您应该检查打开的返回值,以及循环直到读取不再返回数据。这可能是因为文件已结束,也可能是由于错误。

int rc, value;
while ((rc =  = read (fd, &value, sizeof(int)) != sizeof(int))
    printf ("%d\n", value);

if(rc == 0)
{
   // ok
}
else if(rc < 0)
{
   // error in errno.
   perror ("Read returned the following error:");   // perror will print an appropriate error message from errno.
}
else
{
    // file contains data which doesn't match up to a multiple of sizeof(int), so value may be undetermined here.
}
于 2013-09-25T07:27:11.863 回答