System verilog 使用fgetc读取的文件在末尾添加FF
我正在使用fgetc读取一个文件。文件读取从一个偏移量开始。在末尾,我看到文件末尾追加了8'hFF。我希望文件中有6个字节,但看到7个字节。我不确定为什么会发生这种情况。有什么想法吗 下面是我的代码:System verilog 使用fgetc读取的文件在末尾添加FF,system-verilog,fgetc,System Verilog,Fgetc,我正在使用fgetc读取一个文件。文件读取从一个偏移量开始。在末尾,我看到文件末尾追加了8'hFF。我希望文件中有6个字节,但看到7个字节。我不确定为什么会发生这种情况。有什么想法吗 下面是我的代码: module file_read(); integer fd,fd1,file_char,status; logic [7:0] captured_data; initial begin fd = $fopen("input_file", "rb");
module file_read();
integer fd,fd1,file_char,status;
logic [7:0] captured_data;
initial begin
fd = $fopen("input_file", "rb");
fd1 =$fopen("write_file","w");
status=$fseek(fd,1872,0);
assert (status);
// while ($fgetc(fd) != `EOF) begin
while (!$feof(fd)) begin
file_char=$fgetc(fd);
$display("file char is %h",file_char);
end
end // initial begin
以下是文件内容(十六进制):
输入_文件的最后一行(文件总大小=1878):
0000750:0000 1567 d48d…g
写入\u文件:
0000000:0000 1567 d48d ff…g
谢谢 您在写入文件末尾获得额外的
'hff
的原因是由于$feof
(或者通常是foef
C函数)的工作方式。简单地说,它不会检查下一次读取是否离开文件的结尾,而是检查上一次读取是否离开文件的结尾。因此,如果使用$fgetc
逐字符(逐字节)读取,则$feof
仅在$fgetc
读取文件末尾时返回true,并返回EOF
本身(即,-1或'hff
,如果转换为逻辑[7:0]
)。每次读取一个字节时,您都应该检查此错误情况,如下所示:
integer fd, ch;
...
fd = $fopen("file.bin", "rb");
...
while ((ch = $fgetc(fd)) != -1) begin
$display(ch);
end
我也试过了。我读取了备用字节,显示如下:read_字节是00000000 read_字节是00000067 read_字节是0000008d,如果您看到上面缺少15和d4file@coding_gal您是否在代码中调用了两次
$fgetc
?注意,在我的示例代码中,我只调用它一次来检查EOF
以及设置ch
。我不在循环体中调用它,只在条件中调用。如果你仍然有问题,你能发布你正在尝试的代码,通过编辑你的答案来获得结果吗?哦,是的,我没有注意到。谢谢!很多。@coding\u gal没问题,如果你已经准备好了,请接受答案,如果你需要更多帮助,请告诉我们。