当文件内容被读入c中的数组时,会打印额外的字符

时间:2014-08-09 15:05:17

标签: c

我只是想读取一个文件并将其存储在一个数组中。 我尝试了以下代码

#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

为什么会这样?如何解决?

1 个答案:

答案 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)。