我有这个奇怪的问题:
我将16个字符写入二进制文件,然后写入3个整数但是当我用一些二进制文件查看器打开文件时,我看到添加了一个额外的字节(等于 0x0D )。 / p>
这是我的代码:
for(i = 0; i < 16; i++)
{
if(i < strlen(inputStr))
{
myCharBuf[0] = inputStr[i];
}
else
{
myCharBuf[0] = 0;
}
fwrite(myCharBuf, sizeof(char), 1, myFile);
}
myIntBuf[0] = inputNumber1;
fwrite(myIntBuf, sizeof(int), 1 ,myFile);
myIntBuf[0] = inputNumber2;
fwrite(myIntBuf, sizeof(int), 1 ,myFile);
myIntBuf[0] = inputNumber3;
fwrite(myIntBuf, sizeof(int), 1 ,myFile);
我得到以下字节值:
61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0D 0A 00 00 00 05 00 00 00 08 00 00 00
当我期待:
61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0A 00 00 00 05 00 00 00 08 00 00 00
有没有人知道为什么会这样?
答案 0 :(得分:16)
0A是换行符,0D是回车符。这些通常与文本模式相关联。
您是否以二进制模式打开文件? (例如fopen("foo.txt", "wb"
))
答案 1 :(得分:11)
当您打开文件时,打开以写为二进制文件"wb"
:
fopen(filename, "wb");
在文本模式下打开时,会发生换行(0A
)和回车(0D
)的转换。
答案 2 :(得分:7)
fopen
二进制模式下的文件“wb”。
fopen(filename, "wb");
否则,库中的代码将执行自动行结束翻译(在Windows上 您在Windows上,不是吗? ,这意味着翻译'\n'
到'\r' '\n'
)。
答案 3 :(得分:1)
MS-DOS(今天使用Windows),在文本模式下写入文件时,在每个0x0A之前添加一个0x0D。换句话说,它处理任意数据流,因为它们往返于商店和混淆数据 - 完全是彻头彻尾的疯狂。
以二进制模式打开文件以进行非疯狂处理。
答案 4 :(得分:0)
我相信你的inputStr变量包含一个换行符,它被写入二进制文件作为回车符和换行符 - 二进制'0D'后跟'0A'。
例如,以下程序按如下方式写入16个字符和3个数字。
FILE *fp;
fp = fopen("sample.bin", "wb+");
if(fp == NULL)
{
printf("Cannot create a file\n");
return;
}
int i;
char c[1] = {'A'};
for(i = 0; i < 16; i++)
{
fwrite(c, sizeof(char), 1, fp);
c[0]++;
}
int ip[1] = {1};
fwrite(ip, sizeof(int), 1, fp);
fwrite(ip, sizeof(int), 1, fp);
fwrite(ip, sizeof(int), 1, fp);
fclose(fp);
如果使用转储程序(如'od')查看'sample.bin'文件,则会按如下方式提供内容。
od -t x1 -c sample.bin
0000000 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50
A B C D E F G H I J K L M N O P
0000020 01 00 00 00 01 00 00 00 01 00 00 00
001 \0 \0 \0 001 \0 \0 \0 001 \0 \0 \0
0000034
答案 5 :(得分:0)
此代码
#include <stdio.h>
#define SECTORSIZE 512 // bytes per sector
int main(int argc, char *argv[])
{
FILE *fp; // filepointer
size_t rdcnt; // num. read bytes
unsigned char buffer[SECTORSIZE];
if(argc < 2)
{
fprintf(stderr, "usage:\n\t%s device\n", argv[0]);
return 1;
}
fp = fopen(argv[1], "rb");
if(fp == NULL)
{
fprintf(stderr, "unable to open %s\n",argv[1]);
return 1;
}
rdcnt = fread(buffer, 1, SECTORSIZE, fp);
if(rdcnt != SECTORSIZE)
{
fprintf(stderr, "reading %s failed\n", argv[1]);
fclose(fp);
return 1;
}
fwrite(buffer, 1, SECTORSIZE, stdout);
fclose(fp);
return 0;
}
请从这里开始 https://redeaglesblog.wordpress.com/2011/04/05/sektoren-eines-datentragers-lesen/
从任何给定的磁盘读取引导扇区
粘贴在您首选的C(ANSI)IDE或编辑器中,它在Windows中编译和工作(mingw传递\。\ PhysicalDriveX)和linux(gcc传递/ dev / sdX)
但它只是在Linux中的魅力,而它无论如何在任何x0A之前插入/添加x0D而不是fp = fopen(argv[1], "rb");
我已经使用mingw作为readsect.exe
从code :: blocks编译它并运行它读取我的硬盘的启动扇区
c:\readsect.exe \\.\PhysicalDrive0 > read.bin
文件read.bin的结果是长度为515字节而不是512.
使用能够打开物理驱动器的HEX编辑器,我将引导扇区内容与read.bin内容进行了比较。
嗯,物理引导扇区中的每个x0A(x0A被发现3次),在read.bin文件中被转储为x0D + X0A。所以我有三个x0D,三个字节。
谷歌,它看起来像是一个广泛报道的问题。
你们有没有找到修复方法? 也许stdio.h需要修复windows环境?
谢谢