System verilog 使用fgetc读取的文件在末尾添加FF

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");

我正在使用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");
        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没问题,如果你已经准备好了,请接受答案,如果你需要更多帮助,请告诉我们。