2017-01-25 4 views
1

Aloha,Как читать большой файл с функцией read() в C

Я здесь новый, поэтому, пожалуйста, успокойтесь. Я пытаюсь прочитать файл с функцией read(), а затем write() в файл или файловый дескриптор. Моя функция успешно читает файл, но проблема возникает, когда я пытаюсь прочитать больший файл (в моем примере размером 40 000 байт).

Я думаю, что я должен написать цикл WHILE, который будет чтение до конца файла, но я застрял на идее о том, как ..

(открыть файл или файл дескриптора в основной программы)

Моя функция (также преобразовать двоичные входные данные полукокса и записывает в ASCII):

void function(int readFrom,int writeOn){ 
    char buffer[100]; 
    int x = read(readFrom, buffer, sizeof(buffer)); 
    int size= x/8; 
    int i; 
    for(i=0; i<size; i++){ 
     char temp[sizeof(int)-1]; 
     sprintf(temp,"%d",buffer[i]; 
     write(writeOn, temp, sizeof(temp)); 
    } 
} 
+0

'size (int) -1' на самом деле не большой буфер. – usr2564301

+0

Показать «пример» из 40 тыс. Прочитанных. –

+0

Возможный дубликат [Чтение большого файла с использованием C (более 4 ГБ) с использованием функции чтения, вызывающей проблемы] (http://stackoverflow.com/questions/11790822/reading-a-large-file-using-c-greater- чем-4gb-using-read-function-cause-pro) –

ответ

2

Вы должны проверить возвращаемое значение функции read и write. Они возвращают количество прочитанных/записанных байт, которые могут быть меньше числа, которое вы передали в качестве третьего аргумента. Оба read и write должны быть сделаны в цикле, как:

int bytesRead = 0; 

while (bytesRead < sizeof(buffer)) { 
    int ret = read(readFrom, buffer + bytesRead, sizeof(buffer) - bytesRead); 

    if (ret == 0) 
     break;/* EOF */ 

    if (ret == -1) { 
     /* Handle error */ 
    } 

    bytesRead += ret; 
} 
+2

Если вы достигнете EOF, прежде чем заполнить буфер, вы застряли в бесконечном цикле. – PSkocik

+0

Конечно, спасибо @PSkocik. –

2

используется sprintf() для преобразования символов из buffer в очень маленький буфер temp. В большинстве современных систем int составляет 4 байта, поэтому ваш printf вызывает переполнение буфера для значений char, превышающих 99 (ASCII-письмо 'c'). Обратите внимание, что char может быть подписано по умолчанию, поэтому для отрицательных значений менее -99 потребуется 5 байтов для преобразования строк: 3 цифры, знак минус и нулевой терминатор.

Вы должны сделать этот буфер более крупным.

Кроме того, я не понимаю, почему вы обрабатываете только x/8 байт из буфера, считываемого функцией read(). Цель вашей функции неясна.