在大多数(全部?)实现中,整数将数字的二进制表示存储在该整数的位和字节中。另一方面,字符串和文本文件之类的内容使用字节来存储数字、空格和换行符的 ASCII 值。
int
(假设 4 字节,每个字节 8 位,大端)可以这样存储值 1234:
Address 0x42 0x43 0x44 0x45
Value 0x00 0x00 0x04 0xD2
Text NUL NUL EOT Ò
另一方面,字符串可以包含代表文本的每个字符的 ASCII 值。字符串“1234”可以这样存储:
Address 0x82 0x83 0x84 0x85 0x86
Value 0x31 0x32 0x33 0x34 0x00
Text 1 2 3 4 NUL
当您进行读取时,您会读取文本文件的字符。将它们读入char
数组很容易,您无需进行任何对话,只需在末尾添加 NUL-Byte。当您想获取数字时,您必须将它们从字符串转换。
这意味着您必须读取文件,read()
如果需要,您可以这样做,并将内容存储在char
数组中,添加 NUL 字节,然后使用类似strtol()
or的函数转换结果字符串sscanf()
。
你在做什么
您所做的是将 ASCII 字符读入int
len
. 在调用前使用调试器时write()
,可以检查len
. 就我而言,我将其用作输入文件:
0
1
2
3
...
当我之前停止调试器时write()
,我看到它len
的值是170986032 == 0xA310A30
. 我的系统是小端的,意味着最低字节存储在最低地址(与我之前的示例不同)。这意味着首先出现,0x30
然后和。由此我们知道我们得到了以下的内存布局。0x0a
0x31
0x0A
len
Address Offset 0x00 0x01 0x02 0x03
Value 0x30 0x0A 0x31 0x0A
Text 0 LF 1 LF
如您所见,文本被解释为int
.
如何得到你想要的
您想将数据存储到char
数组中。然后解析它。我使用一些伪代码来更好地解释它。这不是 C 代码。您应该学习编写自己的代码。这只是为了让您了解您必须做什么:
char buffer[<buffersize>] //create a buffer array
r=read(buffer) //read the file into the buffer. You may need to repeat that multiple times to get everything
if r==error //check for errors
<do some error handling here>
buffer[<one after the last read byte>]='\0' //add the NUL-Byte st the end, so that we have a string.
int values[<number of ints you want>] //create an array to store the parsed values
for(<one loop for every int>) //make the loop for every int, to parse the int
values[<index>]=strtol(buffer,&buffer,0) //parse the text to a int
if error occured:
<do some error handling here>
如何在 C 中实现这一点是您的任务。请记住缓冲区大小,这样您就不会以 UB 结尾。