2011-03-27 57 views
0
unsigned long int nextOffset, currOffset, len; 
nextOffset = read offset from file (eg. 15) 
currOffset = read prev offset from file (eg. 0) 

len = nextOffset-currOffset; 
str = malloc((int)len); 
fread(str,(int)(len)-1,1,dataFile); 
str[(int)len]='\0'; 

rowAddr = ftell(tempDataFile); 
fwrite(&rowAddr,sizeof(unsigned long int),1,tempOffsetFile); 
fwrite(str,(int)(len)-1,1,tempDataFile); 

free(str); 

由於某種原因,我不能使用的fread數據文件讀給從文件中讀取數據..我調試它,我發現是,striing STR正顯示出隨機數據。當我這樣做的strlen(STR)它表明1709936 .....無法使用的fread

什麼可能是錯這個代碼..所有這些文件都是以二進制方式opeend ...

+1

malloc預計size_t,我不確定(int)轉換中的點......並且即使您期望它爲1,我也會放一個* sizeof(char)。您還應該檢查由fread和fwrite返回的值。你的代碼現在可以解決問題。 (也檢查malloc的返回) – Ptival 2011-03-27 05:01:23

+0

@Ptival:是的,它非常無厘頭,無論我正在做什麼演員...我無法找出原因,所以我只是通過無符號傳遞給malloc和其他函數可能會導致它行爲異常.. – pratik 2011-03-27 16:42:09

回答

0

說什麼Ptival

但最重要的問題是,如果你分配n字節,它們的編號從0到n -1。您將字節n設置爲零,並且該字節超出了您的malloc()版本的結尾。所以你可能無意中跺腳了一些其他的數據。 C不會阻止你以這種方式射擊自己。

否則,根據您所說的需要,您的代碼似乎沒有太多錯誤。我充實了一下,並將其全部包裝在一個小腳本中以便於運行。該腳本:

#!/bin/sh 
# pgm 1 generates a binary file. 
# pgm 2 dumps a file. 
# pgm 3 demos a solution to your problem. 
rm -f 1 2 3;          \ 
cat > 1.c <<EOD; cat > 2.c <<EOD; cat > 3.c <<EOD; \ 
gcc -Wall -Werror 1.c -o 1;      \ 
gcc -Wall -Werror 2.c -o 2;      \ 
gcc -Wall -Werror 3.c -o 3;      \ 
./1; ./2 dataFile.dat; ./3;      \ 
./2 tempDataFile.dat; ./2 tempOffsetFile.dat 
#include <stdio.h> 
#include <stdlib.h> 
int 
main(int argc, char**argv) 
{ 
    unsigned int jndex; 
    unsigned char buffer[4]; 
    FILE   *phyle; 

    phyle=fopen("dataFile.dat","w+"); 
    if(!phyle) 
    { 
    fprintf(stderr,"%s: fopen() fail\n",argv[0]); 
    exit(1); 
    } 
    for(jndex='A'; 
     jndex<='Z'; 
     jndex++ 
    ) 
    { 
    buffer[0]=jndex; 
    if(!fwrite(buffer,sizeof(char),1,phyle)) 
    { 
     fprintf(stderr,"%s: fwrite() fail\n",argv[0]); 
    } 
    } 
    fclose(phyle); 
    printf("%s complete\n",argv[0]); 
    return 0; 
} 
EOD 
#include <stdio.h> 
#include <stdlib.h> 
int 
main(int argc, char**argv) 
{ 
    int   jndex; 
    unsigned char buffer[4]; 
    FILE   *phyle; 

    if(argc!=2) 
    { 
    fprintf(stderr,"%s: arg error\n",argv[0]); 
    exit(1); 
    } 
    phyle=fopen(argv[1],"r"); 
    if(!phyle) 
    { 
    fprintf(stderr,"%s: fopen fail\n",argv[0]); 
    exit(1); 
    } 
    for(jndex=0; 
     ; 
     jndex++ 
    ) 
    { 
    if(!fread(buffer,sizeof(char),1,phyle)) 
    { 
     break; 
    } 
    printf("%02X",buffer[0]); 
    if(jndex%16==15) 
    { 
     printf("\n"); 
    } 
    else 
    if(jndex%2==1) 
    { 
     printf(" "); 
    } 
    } 
    if(jndex%16) 
    { 
    printf("\n"); 
    } 
    fclose(phyle); 
    printf("%s %s complete\n",argv[0],argv[1]); 
    return 0; 
} 
EOD 
#include <stdio.h> 
#include <stdlib.h> 

FILE *dataPhyle; 
FILE *tempDataPhyle; 
FILE *tempOffsetPhyle; 
void do_one_guy(char    *pgmName, 
       unsigned long int nextOffset, 
       unsigned long int curOffset 
       ) 
{ 
    unsigned long int len; 
    long    rowAddr; 
    char    *str; 

    len=nextOffset-curOffset; 
    str=malloc(len); 
    if(str==NULL) 
    { 
    fprintf(stderr,"%s: malloc() fail\n",pgmName); 
    exit(1); 
    } 
    if(fread(str,sizeof(char),len-1,dataPhyle)!=len-1) 
    { 
    fprintf(stderr,"%s: fread() fail\n",pgmName); 
    } 
    str[len-1]='\0'; 
    printf("record content is %s\n",str); 
    rowAddr=ftell(tempDataPhyle); 
    if(fwrite(&rowAddr,1,sizeof(rowAddr),tempOffsetPhyle)!=sizeof(rowAddr)) 
    { 
    fprintf(stderr,"%s: fwrite(first) fail\n",pgmName); 
    } 
    if(fwrite(str,sizeof(char),len-1,tempDataPhyle)!=len-1) 
    { 
    fprintf(stderr,"%s: fwrite(second) fail\n",pgmName); 
    } 
    free(str); 
} 
int 
main(int argc, char**argv) 
{ 
    dataPhyle=fopen("dataFile.dat","r"); 
    if(!dataPhyle) 
    { 
    fprintf(stderr,"%s: fopen(\"dataFile.dat\") fail\n",argv[0]); 
    exit(1); 
    } 
    tempOffsetPhyle=fopen("tempOffsetFile.dat","w+"); 
    if(!tempOffsetPhyle) 
    { 
    fprintf(stderr,"%s: fopen(\"tempOffsetFile.dat\") fail\n",argv[0]); 
    exit(1); 
    } 
    tempDataPhyle=fopen("tempDataFile.dat","w+"); 
    if(!tempDataPhyle) 
    { 
    fprintf(stderr,"%s: fopen(\"tempDataFile.dat\") fail\n",argv[0]); 
    exit(1); 
    } 
    do_one_guy(argv[0],32,16); 
    do_one_guy(argv[0],12,8); 
    printf("%s complete\n",argv[0]); 
    return 0; 
} 
EOD 

輸出:

./1 complete 
4142 4344 4546 4748 494A 4B4C 4D4E 4F50 
5152 5354 5556 5758 595A 
./2 dataFile.dat complete 
record content is ABCDEFGHIJKLMNO 
record content is PQR 
./3 complete 
4142 4344 4546 4748 494A 4B4C 4D4E 4F50 
5152 
./2 tempDataFile.dat complete 
0000 0000 0F00 0000 
./2 tempOffsetFile.dat complete 

希望這有助於。

+0

嘿謝謝比爾的答案,它幫助..其實我正在做的是分配n個字符的大小和den設置第n個字符'\ 0'這是所有導致問題..我改變它,現在它工作......還要感謝它幫助的shell程序..代碼現在正在工作.. :) :) – pratik 2011-03-27 16:44:15