2012-03-08 234 views
1

我不能为我的生活记住如何做到这一点。这个程序打开一个文件然后读取文件。我想要做的就是打印刚刚阅读的内容。打印一个字符[]

int main(int argc, char *argv[]) 
{ 
    char memory[1000]; //declare memory buffer size 
    int fd = 0; 
    int count = 1000; 


    if ((fd = open(argv[1], O_RDONLY)) == -1) 
    { 
     fprintf(stderr, "Cannot open.\n"); 
     exit(1); 
    } 

    read(fd, memory, count); 

    //printf the buffered memory contents 

    return 0; 
} 

回答

8

printf接受%s格式打印C字符串。但是,默认情况下,它要求字符串具有null-terminator(0x0 ASCII码)。如果您确信有人读通过调用read,那么你可以这样做:

printf("%s\n", memory); 

但是,你不能确定。因为您甚至不检查读取的字节数或错误代码。 所以你必须先解决你的代码。

一旦你完成检查错误,并知道了多少字节读取,你可以这样做:

printf("%.*s\n", (int)bytes_that_were_read, memory); 

祝你好运!

+1

谢谢你,我不知道该怎么办! – 2012-03-08 13:31:33

+1

它不是'printf(“%。* s \ n”)'? – hmjd 2012-03-08 13:31:54

+0

@hmjd:对。纠正。谢谢! – 2012-03-08 13:32:21

0

您可以使用一个for循环和printf("%c", buffer[i])在一次打印一个字符,或者您可以使用printf("%s", buffer)如果缓冲区是空结尾的字符串。

0
for (unsigned int i = 0; i < count; i++) { 
    printf("%c", memory[i]); 
} 
0
  1. 将最后一个字符来\0内存
  2. 用printf()

或者读取一个字符少,因为最后一个,你需要将其设置为\0

-1

如果该文件的文本文件,只需使用printf:

printf(memory); 

尽管你必须null来终止缓冲区。

+0

当心!切勿在没有格式说明符的情况下printf()未知数据。想象一下,文件内容是'我是EVIL%s%s%s%s!' - 而不是文件数据,你会得到垃圾输出或分段错误。 – 2012-03-08 21:35:49

1

出于某种原因,您是否必须坚持使用printf()?如果该文件与内部的某个地方的'\0'二进制文件相关?这将甚至打破printf("%.*s", ...)。如果你用read()阅读,你应该可以用write()

while (bytes_written < bytes_read) 
{ 
    ssize_t x = write(STDOUT_FILENO, 
         memory + bytes_written, 
         bytes_read - bytes_written); 
    if (-1 == x) 
    { 
     exit(1); 
    } 
    bytes_written += x; 
}