2009-11-14 101 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