Чтение файла с использованием fgetc добавляет FF в конце
Я читаю файл с помощью 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..
запись_файла: 0000000: 0000 1567 d48d ff ...g...
Спасибо!
1 ответ
Причина, по которой вы получаете дополнительное 'hff
в конце написанного файла связано с тем, как $feof
(или вообще foef
С функцией) работает. Проще говоря, он не проверяет, находится ли следующее чтение за концом файла, но проверяет ли предыдущее чтение конец файла. Итак, если вы читаете символ за символом (побайтно), используя $fgetc
, $feof
вернет истину только один раз $fgetc
читает конец файла и возвращает EOF
сам (т.е. -1 или 'hff
если преобразовано в logic [7:0]
). Вы должны проверять это состояние ошибки каждый раз, когда читаете байт, что-то вроде этого:
integer fd, ch;
...
fd = $fopen("file.bin", "rb");
...
while ((ch = $fgetc(fd)) != -1) begin
$display(ch);
end