【问题标题】:Manage data inside a buffer管理缓冲区内的数据
【发布时间】:2009-11-14 18:04:40
【问题描述】:

我正在使用此代码将文件读入缓冲区。该文件充满了evaluacion 类型的structs(包括一些charint 变量)。 现在我将整个文件放在缓冲区中,我现在如何在缓冲区中找到一个变量的值? 例如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);
}
{
}
}
}

【问题讨论】:

  • 不要忘记将您的读取放入循环中以读取整个文件。此外,仅 mmap() 文件可能更容易。
  • @Suppressingfire:无论如何,在 fstat() 函数执行时,他都会进行一次读取以获取整个文件。

标签: c file buffer


【解决方案1】:

最容易将缓冲区定义为指向数据结构的指针并使用它来取消引用数据(尽管您应该确保文件大小是结构大小的倍数)。

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

然后您可以增加索引以访问您加载的其他结构。

【讨论】:

  • 感谢 tyranid 的回答。在这种情况下,我是否应该逐个读取一个结构,并在每次搜索变量时读取文件?我需要做的是只读取一次文件,使用内存中的结构进行操作,然后再次将文件写入磁盘一次。
  • 如果缓冲区一个接一个地包含评估,那么你可以只看第二个缓冲区[1],第三个缓冲区[2]...只要确保除以st_size通过 sizeof(evaluacion) 确保您不会超出文件末尾(即,不要让缓冲区索引大于 st_size/sizeof(evaluacion)。
【解决方案2】:

感谢cmets,我想我解决了问题,我修改了代码:

#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。 知道我能做什么吗? 谢谢

【讨论】:

  • 我想我用 lseek 解决了它,在写之前将指针放在开头。 lseek(fd,OL,SEEK_SET); :)
猜你喜欢
  • 1970-01-01
  • 2013-01-16
  • 2022-01-03
  • 2017-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多