我正在使用此代码将文件读入缓冲区。该文件已满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);
}
{
}
}
}
答案 0 :(得分:5)
最容易将缓冲区定义为指向数据结构的指针,并使用它来取消引用数据(尽管您应该确保文件大小是结构大小的倍数)。
即
evaluacion* buffer = (evaluation*)malloc(datos.st_size);
if(buffer[0].notamedia >= 4.5)
然后,您可以增加索引以访问您加载的其他结构。
答案 1 :(得分:1)
感谢您的评论,我想我解决了这个问题,我修改了代码:
#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.5Mb,两次7MB,依此类推:S。 知道我该怎么办? 感谢