2010-04-28 4 views
2

gcc 4.4.1Использование функции чтения для чтения в файле

Я использую функцию чтения для чтения в волновом файле. Однако, когда он переходит к функции чтения. Выполнение, кажется, останавливается и замерзает. Мне интересно, не делаю ли я что-то неправильно с этим.

Размер файла test-short.wave: 514K.

То, что я собираюсь, это прочитать файл в кубах памяти одновременно. В настоящее время я просто тестирую это.

Большое спасибо за любые предложения,

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <fcntl.h> 
#include <string.h> 
#include <unistd.h> 

int main(void) 
{ 
    char buff = malloc(10240); 
    int32_t fd = 0; 
    int32_t bytes_read = 0; 

    char *filename = "test-short.wav"; 

    /* open wave file */ 
    if((fd = (open(filename, O_RDWR)) == -1)) 
    { 
     fprintf(stderr, "open [ %s ]\n", strerror(errno)); 
     return 1; 
    } 
    printf("Opened file [ %s ]\n", filename); 
    printf("sizeof(buff) [ %d ]\n", sizeof(buff)); 

    bytes_read = read(fd, buff, sizeof(buff)); 

    printf("Bytes read [ %d ]\n", bytes_read); 

    return 0; 
} 

=== Редактировать исправления ===

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <fcntl.h> 
#include <string.h> 
#include <unistd.h> 

int main(void) 
{ 
    char buff[10240] = {0}; 
    int32_t fd = 0; 
    int32_t bytes_read = 0; 
    const char *filename = "test-short.wav"; 

    fd = open(filename, O_RDWR); 
    if(fd == -1) 
    { 
    fprintf(stderr, "open [ %s ]\n", strerror(errno)); 
    return 1; 
    } 

    printf("sizeof(buff) [ %d ]\n", sizeof(buff)); 
    printf("strlen(buff) [ %d ]\n", strlen(buff)); 

    bytes_read = read(fd, buff, sizeof(buff)); 
    printf("Bytes read [ %d ]\n", bytes_read); 

    return 0; 
} 
+0

cough libsndfile cough –

ответ

5
  1. Вы назначаете указатель на char, а не char*.
  2. Читаешь sizeof(char) (скорее всего 1 байт), а не 10240.
  3. Вы читать данные в любой buff, преобразуется в указатель, указывает, а не в нагишом.
  4. Проблема приоритета, упомянутая Игнасио Васкес-Абрамом, по-прежнему актуальна.
  5. Вы вызываете strlen() на символ, что не имеет смысла. Еще меньше, прежде чем заполнять то, что должно быть буфером.
  6. Вы назначаете const char * (строковый литерал) на char*.

Не предупреждают ли компиляторы об этом коде?

+0

Я внесла исправления. На самом деле я компилирую со следующим -Wall -Wextra -ggdb – ant2009

+0

Я бы ожидал, что отредактированный код будет работать. То есть, дайте свои 10240, 0 и 10240 (при условии, что файл больше и, по вашему мнению, он есть) на выходе. –

4

== имеет более высокий приоритет, чем =:

if((fd = open(filename, O_RDWR)) == -1) 
Смежные вопросы