我正在尝试使用C从图像文件中读取十六进制值。在Linux中,此代码工作正常,但在Windows中它只读取前334个字节,我不明白为什么。
读取文件的代码是:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
void readHexFile(char* path) {
FILE *fp;
if ((fp = fopen (path, "r")) != NULL) {
struct stat st;
stat(path, &st);
int i;
int ch;
for (i = 0; i < st.st_size; i++) {
ch = fgetc(fp);
printf("%x ", ch);
}
fclose(fp);
}
else {
return NULL;
}
}
st.st_size
来自<sys/stat.h>
包,包含正确的值(图像文件的大小,以字节为单位)
此图像显示我的程序输出的内容,以及它正在读取的文件的实际二进制内容:
答案 0 :(得分:5)
您以文本模式打开文件,而不是二进制。不同的平台可能表现不同。
在这种情况下,Microsoft Windows决定此纯文本文件在第一次出现Ctrl+Z
(0x1A
)时结束,之后返回EOF
所有fgetc
。
明确声明您要将文件打开为二进制文件:
fp = fopen ("yourfile", "rb");
问题就消失了。
答案 1 :(得分:1)
我认为你的循环应该是这样的:
int ch;
while (!feof(fp)) {
ch = fgetc(fp);
printf("%x ", ch);
}
我完全不清楚为什么你在这里使用st.st_size
。
答案 2 :(得分:1)
在Windows上,字符<div id="workers" />
<script type="text/javascript">
function getWorkers()
{
var dateToView = nv.selectionStart.toString();
dateToView = dateToView.slice(0, 10);
$.ajax({
type: "POST",
url: "/Home/GetWorkers",
data: { date: dateToView },
success: function (data) {
var markup = '<ul id="workersList">';
for (var i = 0; i < data.length; i++)
{
var start = new Date(parseInt(data[i].PlanStart.replace('/Date(', '')));
start = start.toLocaleTimeString();
var end = new Date(parseInt(data[i].PlanEnd.replace('/Date(', '')));
end = end.toLocaleTimeString();
markup += '<li data-id="' + data[i].WorkSchedulerID + '"><span style="cursor:move">' + data[i].Username + ' ' + start + ' - ' + end + '</span></li>';
}
markup += '</ul>';
$('#workers').html(markup);
}
});
}
</script>
<script type="text/javascript">
function makeDraggable() {
getWorkers();
setTimeout(function () {
console.log("THIS IS");
}, 2000);
var parent = document.getElementById("workersList");
var items = parent.getElementsByTagName("li");
for (var i = 0; i < items.length; i++) {
var e = items[i];
var item = {
element: e,
id: e.getAttribute("data-id"),
text: e.innerText,
duration: e.getAttribute("data-duration"),
keepElement: true
};
DayPilot.Scheduler.makeDraggable(item);
}
}
</script>
(Ctrl + Z)是文本模式的EOF字符;见this question。
如果你正在读取像JPEG这样的二进制文件,你应该首先将文件打开为二进制文件(0x1A
模式fopen
),然后"rb"
进入一个预先分配的缓冲区,其大小由fread
确定,文件指针位于文件的末尾:
ftell