2012-03-08 2 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 (код ASCII 0x0). Если вы уверены, что он был прочитан вызовом read, то вы можете сделать это:

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

Однако, вы не можете быть уверены. Потому что вы даже не проверяете, сколько байтов было прочитано ... или для кода ошибки. Итак, сначала вам нужно исправить свой код.

После того, как вы сделали проверку на наличие ошибок и узнать, сколько байтов было прочитано, вы можете сделать это:

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

Удачи!

+1

Спасибо человек Жестокое получить право на это! –

+1

Разве это не 'printf ("%. * S \ n ")'? – hmjd

+0

@hmjd: Верно. Исправленный. Спасибо! –

0

Вы можете использовать цикл и printf("%c", buffer[i]) печатать один символ в то время, или вы можете использовать printf("%s", buffer) если буфер строка завершается нулем.

0
for (unsigned int i = 0; i < count; i++) { 
    printf("%c", memory[i]); 
} 
0
  1. Установите последний символ в \0 в памяти
  2. использовать Е()

Или почитайте один символ меньше, потому что в прошлом один вам нужно будет установить как \0

-1

Если файл текстовый файл, просто используйте printf:

printf(memory); 

Однако вам придется отказаться от буфера.

+0

Остерегайтесь! Никогда printf() неизвестные данные без спецификатора формата. Представьте, что содержимое файла: «Я - ЗЛО.% S% s% s% s!» - вместо данных файла вы получаете вывод мусора или ошибку сегментации. –

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; 
} 
Смежные вопросы