2013-09-25 16 views
1

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

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

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

回答

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标准的一部分,您可以实现同样以fopenfread基于流的功能结束。

0

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

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. 
} 
0

read函数返回了多少字节actualy阅读,-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(推荐):从read

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有一点不同的是,第二个参数是每个值的大小,第三个参数是要读取多少个值。它将返回它实际读取的数值(不是字节)(在这种情况下,当有值读取时,它将为1)。

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

相关问题