【问题标题】:Reading data from .csv file on MIPS从 MIPS 上的 .csv 文件读取数据
【发布时间】: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


【解决方案1】:

您从文件中读取的数字将采用文本格式。您需要将它们从文本转换(类型转换)为数字。

【讨论】:

    猜你喜欢
    • 2014-01-07
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多