Чтение файла как ресурс - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть «файл» в качестве ресурса. Я могу использовать только read(), write() и fstat(). Этот файл является текстовым файлом, который я хотел бы проанализировать.

Обычно я использую fgets(), чтобы читать текстовый файл построчно и анализировать его. Как я могу сделать это в этом случае?

FILE *fp;
char buffer[128];

fp = fopen( "/home/txtfile", "r" );
if (fp == NULL){
    perror("file missing");
}
while (fgets (buffer, sizeof(buffer), fp) != NULL) {
       //some code
}

Как я могу сделать то же самое с read()?

Это правильно?

int fd = open("/dev/file",O_RDONLY);
if (fd==-1) {
    printf("Failed to open file!!!\n");
}
while (fgets (buffer, sizeof (buffer), fd) != NULL) { 
    //some code 
}

Ответы [ 3 ]

1 голос
/ 02 декабря 2011

Если ваш файл не очень большой, если вы используете read (), было бы легче прочитать весь файл, а затем работать с буфером памяти, а не с отдельными блоками.То есть, если каждая строка не имеет фиксированной длины.

Я бы сделал что-то вроде этого:

int rc;

int fd = open("data", O_RDONLY);  // open the file for reading
if (fd == -1) {
    // error
}

// to be thorough, do a stat() here to find how big to make the buffer
struct stat sb;
rc = fstat(fd, &sb);
if (rc == -1) {
    // error
}

char *buffer = calloc(1, sb.st_size);

int bytes_read = 0;
// read in entire file; each read() can be incomplete, hence why it's in a loop,
// and reading from/writing to increasing sections of the memory and file
while ((rc = read(fd, (buffer + bytes_read), (sb.st_size - bytes_read))) > 0) {
    if (rc == -1) {
        // error
    }

    bytes_read += rc;
}

close(fd);

// Now, to read it line-by-line...
char line[128]; // 128 is arbitrary
int pos = 0;
while ((rc = sscanf(buffer + pos, "%127[^\n]\n", line)) > 0) {
    pos += strlen(line) + 1;
    // do stuff with line
}

return 0;

Затем вы можете построчно работать со своим буфером памяти, сканируядля перевода строки или использования sscanf ().Также убедитесь, что ваш буфер освобожден ()!

Редактировать: Я добавил пример кода для использования sscanf () для обработки вашего буфера.Если вы знаете формат строк (вы говорите, что анализируете их), вы можете лучше использовать sscanf (), используя спецификаторы формата.Кстати, все это не проверено.

1 голос
/ 02 декабря 2011

Примерно так:

int fd = open("/dev/file",O_RDONLY);
ssize_t res = 0;
while((res = read(fd, buffer, sizeof(buffer))) > 0) {
    //some code
}
if (res < 0) {
    //handle error
} else{
   //close fd
}
0 голосов
/ 02 декабря 2011

Это правильно?

Нет.

read () - это системный вызов, который работает с дескриптором файла Unix, а не сstdio FILE*.Помимо этого, он работает, считывая данные из файла и помещая их в предоставленный вами буфер.

int fd = open("/dev/file",O_RDONLY);
if (fd==-1) 
{
    printf("Failed to open file!!!\n");
}
else
{
    char buffer[BUF_SIZE];
    ssize_t bytesRead = read(fd, buffer, BUF_SIZE);
    while (bytesRead > 0) 
    { 
        // do something with the buffer
        bytesRead = read(fd, buffer, BUF_SIZE);
    }
    if (bytesRead == -1)
    {
        // error
    }
    // bytesRead == 0 => end of file

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...