简体   繁体   中英

How to read a large file with function read() in C

Aloha,

I'm new here, so please take it easy on me. I'm trying to read a file with function read() and then write() to a file or a file descriptor. My function successfully reads a file, but a problem occurs when I try to read a larger file(in my example size of 40,000 bytes).

I think that I must write a while loop, which will be reading until the end of a file, but I am stuck on the idea of how to..

(I open a file or file descriptor in main of the program)

My function( also convert binary input char data and writes to the 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));
    }
}

You need to check return value of functions read and write . They return the number of bytes read/written that may be less than the number that you passed as third argument. Both read and write must be done in a loop like:

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;
}

You use sprintf() to convert characters from buffer into a very small buffer temp . On most current systems, int is 4 bytes, so your printf causes buffer overflows for char values greater than 99 (ASCII letter 'c' ). Note that char can be signed by default, so negative values less than -99 will require 5 bytes for the string conversion: 3 digits, a minus sign and a null terminator.

You should make this buffer larger.

Furthermore, I don't understand why you only handle x/8 bytes from the buffer read by the read() function. The purpose of your function is obscure.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM