我有一个c函数,我打开和关闭文件。但我想替换在MIPS中实现的自定义readFile函数的fgets函数。
根据:When reading file in MIPS, it reads last line twice和http://courses.missouristate.edu/kenvollmar/mars/help/syscallhelp.html 我需要传递系统调用代码14;和文件描述符,输入缓冲区的地址和作为参数读取的最大字符数。
当在c中打开文件时,我得到一个FILE *,从中我使用fileno得到一个fileDescriptor(根据这个How can I convert a file pointer ( FILE* fp ) to a file descriptor (int fd)?)。
问题是系统调用似乎没有被执行。缓冲区保持不变,甚至返回寄存器(v0)的值也是14(相同的代码),而不是读取的字符数。
用于调用系统调用的MIPS代码是:
li v0, 14 # system call for read from file
lw a0, 40($fp) # file descriptor
lw a1, 32($fp) # address of buffer to which to read
lw a2, 36($fp) # buffer length
syscall # read from file
可能有什么不对? 感谢
答案 0 :(得分:1)
我终于可以解决这个问题。 碰巧系统调用代码不是14,而是3(SYS_read宏)。
readFile.S中要读取的代码是:
li v0, SYS_read # system call for read from file
lw a0, 40($fp) # file descriptor
lw a1, 32($fp) # address of buffer to which to read
lw a2, 36($fp) # buffer length
syscall # read from file
第一个参数是文件描述符,而不是文件指针。 所以我从main.c调用我的自定义readFile函数,如下所示:
FILE *fp;
fp = fopen("test-files/test.txt", "r");
int fileDescriptor = fileno(fp);
int bufIncrSize = 10;
char *buffer = (char*) malloc(bufIncrSize);
while (readFile(buffer, bufIncrSize, fileDescriptor)) {
printf("%s",buffer);
}
免责声明:此代码不完整,无法替换fgets:
C库函数char * fgets(char * str,int n,FILE * stream)从指定的流中读取一行并将其存储到str指向的字符串中。当读取(n-1)个字符,读取换行符或达到文件结尾时(以先到者为准),它会停止。
SYS_read系统调用不会在换行符处停止,因此它可以读取多行。 所以,你应该自己实现这个beahivour。