C 在if语句和缓冲区类型中读取

C 在if语句和缓冲区类型中读取,c,C,我只是想知道下面的代码如何工作。我试图打开一个文件并使用read()函数读取它。但是,我还想检查读取是否成功 下面的代码是否执行read()两次?我的意思是,在代码执行后,缓冲区中是否有1024字节的数据?或者它只有512字节的数据,因为if语句中只有第一次执行和读取的数据只检查值,而没有真正写入缓冲区。此外,我正在将原始位读入缓冲区。我是否使用了正确的缓冲区类型?如果我不清楚,我很抱歉。提前谢谢 //Read the file void *buffer; read(fd,buffer,512)

我只是想知道下面的代码如何工作。我试图打开一个文件并使用read()函数读取它。但是,我还想检查读取是否成功

下面的代码是否执行read()两次?我的意思是,在代码执行后,缓冲区中是否有1024字节的数据?或者它只有512字节的数据,因为if语句中只有第一次执行和读取的数据只检查值,而没有真正写入缓冲区。此外,我正在将原始位读入缓冲区。我是否使用了正确的缓冲区类型?如果我不清楚,我很抱歉。提前谢谢

//Read the file
void *buffer;
read(fd,buffer,512);
if (read(fd,buffer,512) < 0){
    printf("Error: Read was unsuccessful \n");
}
else{
    printf("Read is successful \n" );
}
//读取文件
空*缓冲区;
读取(fd,缓冲器,512);
if(读取(fd,缓冲器,512)<0){
printf(“错误:读取未成功\n”);
}
否则{
printf(“读取成功\n”);
}
是。函数执行两次。用于检查
if
语句中的条件

if (read(fd,buffer,512) < 0){  
     ...  

您不能初始化
缓冲区
指针并使用它。这是未定义的行为
read()
执行两次,如果缓冲区之前已初始化,则缓冲区可以包含1024字节。但是有可能是
read()
只读512字节的一部分。

是的,
read(fd,buffer,512)
被调用两次。如果希望多次使用返回值,请将其存储在变量中–再次调用同一函数(即使使用相同的参数)与上次调用不同。一般来说,C中的函数可能有副作用,因此无法优化使用相同参数对同一函数的多次调用(例如,
read
的副作用是将描述符中的数据读取到缓冲区中,实际上,调用
read
更多的是因为它读取而不是因为它返回的值)

同时,如果您的代码如图所示是完整的,
buffer
的使用是无效的,因为它未初始化


假设
buffer
确实指向能够保存数据的实际缓冲区,则
read
最多会在那里存储512字节。由于在调用
read
之间不更改
buffer
指向的位置,因此第二次
read
将覆盖相同的缓冲区。(请注意,不能保证所有请求的512字节或任何字节都会被实际读取,
read
的返回值告诉您实际读取了多少字节。)

为什么不检查
read
的返回值?对您的代码调用
读取
两次。您好,您能给我举一个如何执行此操作的示例吗?谢谢
fd
指的是什么:文件、套接字、管道?fd指的是open()函数中的文件描述符。它正在读取fat12.dat文件。缓冲区类型如何?对于原始位,void是可接受的类型吗?谢谢两次读取调用可能读取512+512字节,但第二次读取将覆盖第一次读取。结果是512。缓冲区将永远不会包含更多内容。我将如何初始化它?你能给我看看吗?我主要做Java,所以我对C不太熟悉。谢谢@user2989964好吧,
buffer=malloc(512)
将在堆上分配必要的512字节,但是在不再使用该内存后,您必须
释放(buffer)
一次。或者您可以使用类似于
char buffer[512]
的内容替换指针,将其放在堆栈上。void是处理原始位的可接受类型吗?我以前从未使用过void,所以我不确定。如果没有,你有什么建议?我必须确保我没有将数据视为ASCII。谢谢@user2989964空指针可以指向任何类型的数据。如果不将空指针强制转换为其他对象,则无法取消对空指针的引用。因此,当您实际访问数据时,必须确定某种数据类型,例如,
uint8\t
(或
unsigned char
)将原始字节转换为无符号整数。unsigned char是否会将数据转换为ASCII?我正在考虑使用尺码类型。这样行吗?另外,我可以期望原始字节的形式是什么?它们是十六进制还是二进制?谢谢
buffer = malloc(512);