Управление данными внутри буфера - PullRequest
0 голосов
/ 14 ноября 2009

Я использую этот код для чтения файла в буфер. Файл заполнен structs типа evaluacion (включая некоторые переменные char и int). Теперь у меня есть весь файл в буфере, как мне теперь найти значения одной переменной в буфере? Например buf.notamedia < 4. Предполагается, что их много в файле.

#include <unistd.h>
#include <sys/stat.h>
int revisanotas(int fd)
{
    int nbytes = 1;
    int nbytese = 0;
    evaluacion buf;
    struct stat datos;
    fstat(fd, &datos);

    printf("Size of file =  %d \n", datos.st_size);
    char *buffer = (char *)malloc(datos.st_size);
    int actual = read(fd, buffer, datos.st_size);

    printf("actual = %d\n", actual);

    if (buf.notamedia >= 4.5 && buf.notamedia < 5)
    {
        /* ... */
    }
}

Любая идея приветствуется


Я делаю, как вы сказали, но у меня только одна итерация, я не знаю, что я делаю неправильно: (

evaluacion* buffer=(evaluacion*)malloc(datos.st_size);
int actual = read(fd,buffer,datos.st_size);

printf("Number of structs = %d", (datos.st_size/(sizeof(evaluacion))));

for (i=0;i<(datos.st_size/(sizeof(evaluacion)));i++);
{
printf("Notamedia = %f\n",buffer[i].notamedia);
if (buffer[i].notamedia >= 4.5 && buffer[i].notamedia < 5)
{
printf("Notamedia = %f\n",buffer[i].notamedia);
}
{
}
}
}

Ответы [ 2 ]

5 голосов
/ 14 ноября 2009

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

т.е.

evaluacion* buffer = (evaluation*)malloc(datos.st_size);
if(buffer[0].notamedia >= 4.5)

Затем можно увеличить индекс для доступа к другим загруженным структурам.

1 голос
/ 15 ноября 2009

Спасибо за комментарии, думаю, я решил проблему, я изменил код:

#include <unistd.h>
#include <sys/stat.h>
int revisanotas(int fd)
{
int nbytes=1;
int nbytese=0;
int i=0;
int n=0;
struct stat datos;
fstat(fd, &datos);
evaluacion buf;
printf("File size =  %d \n", datos.st_size);
evaluacion* buffer=(evaluacion*)malloc(datos.st_size);
int actual = read(fd,buffer,datos.st_size);

do 
{
i++;
if (buffer[i].notamedia >= 4.5 && buffer[i].notamedia < 5)
{
n=n+1;
/*printf("Notamedia = %f\n",buffer[i].notamedia);
*/
buffer[i].notamedia=5;
}

}while (i<(datos.st_size/(sizeof(evaluacion)))); 
nbytese=write(fd,buffer,datos.st_size);
printf("Written bytes = %d\n",nbytese);
return(n);
}

Теперь, если условие соответствует, я изменяю буфер. После того, как я прочитал все структуры, я снова записал файл на диск, но у меня все еще есть проблема, каждый раз, вместо того, чтобы записать файл в ту же позицию, мне кажется, что я добавляю ту же информацию после старой, поэтому если я читаю файл один раз, я получаю 3,5 МБ, два раза 7 МБ и так далее: S. Есть идеи, что я могу сделать? Спасибо

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