【发布时间】:2020-08-28 20:45:12
【问题描述】:
我必须开发一个项目,我必须从 .csv 文件中读取数据,如下所示:
10,12.1
15,25.6
15,25.1
...
所以我尝试阅读如下:
.data
file: .asciiz "/home/gilson/Documents/test.csv"
.word 0
buffer: .space 4
.text
main:
#open file
li $v0, 13
la $a0, file
add $a1, $zero, $zero
add $a2, $zero, $zero
syscall
add $s0, $v0, $zero
#read 4 bytes from file
li $v0, 14
add $a0, $s0, $zero
la $a1, buffer
li $a2, 4
syscall
#print
li $v0, 1
lw $a0, buffer
syscall
done:
li $v0, 16
add $a0, $s0, $zero
syscall
exit:
li $v0, 10
syscall
我有以下输出:
824979505
-- program is finished running --
所以我将打印系统调用更改为打印字符串,输出为:
...
li $v0, 4
la $a0, buffer
syscall
...
10,1
我可以看到他正在从文件中读取字符,而不是数字格式。我想知道是否有办法直接读取数字,或者我是否必须使用一些程序来从 char 转换为 int?
【问题讨论】:
-
它不是 char 到 int 它是 ascii 到二进制 "10" = 0x31, 0x30,您需要去掉 0x3x 部分并进行转换。 ((0x31&0xF)*10) + (0x30&0xF) 最终但假设您知道这些是十进制数字而不是其他一些基数(八进制、十六进制、二进制)。
-
如果这是纯十进制数,那么如果 new&0xF0 = 0x30 then accumulator *=10 accumulator+=new&0xF; else(它是一个逗号)保存累加器,将累加器归零并循环返回以获取下一个字符,否则(换行符或回车符)处理。
-
你是学习汇编还是学习算法,还是两者兼而有之?理想情况下,使用您擅长的某种语言对其进行原型制作,然后在调试后将其移植到 asm。将算法问题与语言问题分开解决。分而治之。
-
我正在学习组装,感谢您的提示,这就是我所怀疑的,如果它必须被转换,现在我已经实现了一个转换程序并且它有效。
-
了解电子表格可以生成更复杂的 csv 文件,但要通过实验来处理(尝试将双引号和逗号放在字段中,然后导出并查看结果)。刚刚注意到你有小数位是故意的还是这个问题的错字,如果这不仅仅是整数,那么你需要处理与同一个循环相似但不精确的浮点数。
标签: csv assembly mips file-read atoi