2009-11-14 102 views
0

我正在使用此代码将文件读入缓冲区。该文件完整为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); 
} 
{ 
} 
} 
} 
+0

不要忘了把你的阅读循环读取整个文件。 此外,它可能更容易只是对mmap()文件。 – Suppressingfire 2009-11-14 18:30:28

+0

@Suppressingfire:无论如何,他执行单个读取来获取整个文件,就像执行fstat()函数时一样。 – 2009-11-14 18:47:34

回答

5

最简单的定义缓冲器的指针的数据结构,并使用该取消引用的数据(尽管应该确保文件的大小是该结构尺寸的倍数)。

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

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

+0

感谢tyranid的答案。在这种情况下,我应该读一个结构体,并且每次搜索变量时都要读取文件? 我需要做的只是读取文件一次,使用内存中的结构进行操作,然后再次将文件写入光盘一次。 – Peter 2009-11-14 18:21:20

+1

如果缓冲区包含一个接一个的评估值,那么您可以仅查看第二个缓冲区[1],第三个缓冲区[2] ...只需确保将size_s(evaluateacion)除以st_size即可确保你不会超过文件的末尾(也就是说,不要让你的缓冲区索引大于st_size/sizeof(evaluateacion)。 – Suppressingfire 2009-11-14 18:29:50

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。 任何想法我能做什么? 谢谢

+0

我想我已经用lseek解决了它,在写入之前将指针放在开头。 (fd,OL,SEEK_SET); :) – Peter 2009-11-15 01:44:09