我只是想读取一个文件并将其存储在一个数组中。 我尝试了以下代码
#include<stdio.h>
#include<string.h>
#include<fcntl.h>
int main()
{
int fd;
char buffer[500];
fd=open("input.txt",O_RDONLY);
read(fd,buffer,500);
printf("\nTHE FILE CONTENTS ARE:\n%s",buffer);
}
input.txt包含:
COPY START 0000
FIRST STL RETADR
CLOOP JSUB RDREC
LDA LENGTH
COMP #0
JEQ ENDFIL
JSUB WRREC
J CLOOP
ENDFIL LDA =C'EOF'
STA BUFFER
LDA #3
STA LENGTH
JSUB WRREC
J @RETADR
USE CDATA
RETADR RESW 1
LENGTH RESW
USE CBLKS
BUFFER RESB 4096
BUFEND EQU *
MAXLEN EQU BUFEND-BUFFER
当我打印时,我会在最后获得额外的角色。
我得到的终点是
MAXLEN EQU BUFEND-BUFFER EQU BUFEND-BUFFER
为什么会这样?如何解决?
答案 0 :(得分:1)
您的代码中有缓冲区溢出。你用文件中的500个字符填充char buffer[500];
参数,然后用printf
填充%s
,它需要一个以零结尾的字符串。但buffer
并非零终止,因此printf
会尝试读取buffer[500]
,buffer[501]
等,直到找到零终结符('\0'
)。< / p>
我建议您将buffer
定义为501个字符,填充500个字符并将buffer[500]
设置为'\0'
,以便printf
不会尝试读取buffer[500]
{1}}。
编辑:实际上只打印从文件中读取的内容,您应检查read
调用的返回值,并将'\0'
字符放在最后写入的字符旁边进入buffer
,例如:
int fd;
char buffer[501];
fd = open("input.txt", O_RDONLY);
const ssize_t r = read(fd, buffer, 500);
if (r < 0) {
// Handle error
} else {
buffer[r] = '\0';
printf("\nTHE FILE CONTENTS ARE:\n%s",buffer);
}
有关详细信息,请参阅read
的手册页(man 3p read
)。