2012-03-31 16 views
0
Operating System Used:Ubuntu 11.04 
Compiler Used: GCC 

プログラム関連のファイル:Git Hub Linkバッファにファイルの内容をコピーすることができません

私はCPP(Cプリプロセッサ)Iのと同じ仕事をするプログラムを実装しようとしています.cファイルをコンパイルします。

この特定のコードでは、Copy_file_to_buf関数はファイル全体をバッファにコピーしません。 アブサルサイズは117406Cですが、copy_file_to_buf関数のftellは114689と表示されています。

EDIT: あり、私は同じプログラムを使用してバッファにdummyfileの内容をコピーしたデータの損失はありませんが、私はtemp.cファイル内の別々のプログラムをcopy_file_to_buf書いています。

temp.c

#include<stdio.h> 
main(int argc,char **argv) 
{ 
    FILE *inputFile; 
    int sizeofFile, rc; 
    char *source_buf; 
    fprintf(stderr, "In Copy_file_to_buf\n"); 
    sleep(1); 

    inputFile=fopen(argv[1],"r"); 
    if (!inputFile) { 
     fprintf(stderr, "Oops, failed to open inputfile \"%s\"\n", argv[1]); 
     return NULL; 
     } 

    fseek(inputFile,0,SEEK_END); 
    sizeofFile=ftell(inputFile); 

    fseek(inputFile,0,SEEK_SET); 
    source_buf=calloc(1,1+sizeofFile); 
    rc = fread(source_buf,sizeofFile,1,inputFile); 
    /* now check rc */ 
    fprintf(stderr, "Size of the file=%d; fread returned %d.\n", sizeofFile, rc); 
    //sleep(5); 
    fclose(inputFile); 
    source_buf[sizeofFile] = 0; 
    puts(source_buf); 
    return source_buf; 
} 

はfseek関数のように見える()と次のコードのために予想されるようにftellは動作していません。

puts("Copying dummyfile contents"); 
test_buf=Copy_file_to_buf("dummyfile"); 
puts(test_buf); 

ファイル名:preprocessor.c

#include"myheader.h" 

/* agrv[1]=preprocessor 
* argv[2]=test.c 
* 
* Program on PREPROCESSOR 
* 
* Steps: 
* 1.Removal of comments. 
* 2.Inclusion of headerfiles. 
* 3.Macro substitution. 
*  a.function like arguments 
*  b.Stringification 
*  c.Concatenation 
* 4.Conditional compilation 
*  a.#Ifdef 
*  b.#If 
*  c.#defined 
*  d.#Else 
*  e.#Elif 

*/ 


int 
main(int argc, char *argv[]) 
{ 
    char *source_buf,*subBuf,*rmc_buf,*test_buf; 
    char **main_header_names,**sub_header_names; 
    int main_header_count,sub_header_count; 

    source_buf=(char *)Copy_file_to_buf(argv[1]);//... 
    rmc_buf=removeComments(source_buf);//... 
    main_header_names=(char **)getMainHeaderNames(rmc_buf);//... 
    source_buf=(char *)Copy_file_to_buf(argv[1]);//... 
    rmc_buf=removeComments(source_buf);//... 
    main_header_count=mainHeaderCounter(rmc_buf);//... 
    printf("Main Header Count=%d",main_header_count);//... 
    includeHeaders(main_header_names,main_header_count); 

    subBuf=(char *)Copy_file_to_buf("pre.i");//... 
    sub_header_names=(char **)getSubHeadersNames(subBuf);//... 

    subBuf=(char *)Copy_file_to_buf("pre.i");//... 
    sub_header_count=subHeadersCounter(subBuf);//... 

    WriteSubHeadersToFile(sub_header_count,sub_header_names,"dummyfile");//... 

    puts("Copying dummyfile contents"); 

    test_buf=Copy_file_to_buf("dummyfile"); 
    puts(test_buf); 

    /*test_buf=removeComments(test_buf); 
    puts(test_buf); 
    sub_header_names=(char **)getSubHeadersNames(test_buf); 
    test_buf=(char *)Copy_file_to_buf("dummyfile"); 
    sub_header_count=subHeadersCounter(test_buf); 

    WriteSubHeadersToFile(sub_header_count,sub_header_names,"dummyfile2"); 
    printf("Line:%d File:%s",__LINE__,__FILE__); 
    */ 

return 0; 
} 

ファイル名:CopyFile.c

#include"myheader.h" 

//Copying input file data into source_buf 

char * Copy_file_to_buf(char *fileName) 
{ 
    FILE *inputFile; 
    int sizeofFile; 
    char *source_buf; 
    puts("In Copy_file_to_buf"); 

    inputFile=fopen(fileName,"r"); 
    fseek(inputFile,0,2); 
    sizeofFile=ftell(inputFile); 
    sizeofFile++; 
    fseek(inputFile,0,0); 
    source_buf=calloc(1,sizeofFile); 
    fread(source_buf,sizeofFile,1,inputFile); 
    printf("SIZE OF THE FILE=%d",sizeofFile); 
    //sleep(5); 
    fclose(inputFile); 

    return source_buf; 
} 
あなたが一つのブロックを読み取るために freadを求めている
+1

Microsoftプラットフォームを使用している場合、 'fopen(fileName、" rb ");'が必要な場合があります。 – wildplasser

+0

@wildplasser 私はUnbuntu 11.04で上記のコードをコンパイルしました。 私は 'fopen(fileName、" rb ");'を試しましたが、結果は同じでした。 – SlashQB

+0

マジック定数の代わりに定義済みのマクロ( 'SEEK_SET'、' SEEK_CUR'、または 'SEEK_END')を使用してください。 – pmg

答えて

1

sizeofFileが長い。そのサイズのブロックを読み取れない場合は、失敗してゼロを返します。代わりに、1バイト長のブロックsizeofFileを要求する方が良いでしょう。次に、それが正確にどのようにバイトを読み取ることができるかを報告します。これは、いくつかの理由でsizeofFileよりも小さいかもしれません。あなたのケースでは

rc = fread(source_buf, 1, sizeofFile inputFile) ; 

あなたは以前にそれをインクリメントするので、読むべきsizeofFileバイトがあったことがないので、それは常にsizeofFileよりも少なくなります。バッファサイズではなくファイルサイズを読み取っておく必要がありますが、いずれの場合でも1バイトの複数のブロックを読み取ることは依然として好ましい方法です。実際、私は以下の変更を提案します:

sizeofFile = ftell(inputFile) ; 
// REMOVED sizeofFile++ ; 
fseek(inputFile, 0, SEEK_SET) ; 
source_buf = calloc(1, sizeofFile + 1) ;  // Don't confuse file size and buffer size here. 
rc = fread(source_buf, 1, sizeofFile, inputFile) ; // SWAPPED param 2 and 3 

固定長レコードを読む場合、1以外のブロックサイズを使用することは意味があります。任意の長さのバイトストリームを読み取る場合、サイズは一般に1であり、カウントはデータの読み込み量を決定するために使用されます。

1
char * Copy_file_to_buf(char *fileName) 
{ 
    FILE *inputFile; 
    int sizeofFile, rc; 
    char *source_buf; 
    fprintf(stderr, "In Copy_file_to_buf\n"); 

    inputFile=fopen(fileName,"r"); 
    if (!inputFile) { 
     fprintf(stderr, "Oops, failed to open inputfile \"%s\"\n", fileName); 
     return NULL; 
     } 

    fseek(inputFile,0,SEEK_END); 
    sizeofFile=ftell(inputFile); 

    fseek(inputFile,0,SEEK_SET); 
    source_buf=calloc(1,1+sizeofFile); 
    rc = fread(source_buf,sizeofFile,1,inputFile); 
    /* now check rc */ 
    fprintf(stderr, "SIZE OF THE FILE=%d; fread returned %d.\n", sizeofFile, rc); 
    //sleep(5); 
    fclose(inputFile); 
    source_buf[sizeofFile] = 0; 
    return source_buf; 
} 

UPDATE:テストは...メイン+が含まれ

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main (int argc, char **argv) 

{ 
char *lutser; 

lutser = Copy_file_to_buf(argv[1]); 

fprintf (stderr, "Strlen(lutser)=%u\n", (unsigned) strlen(lutser)); 

puts (lutser); 
return 0; 
} 

を追加するために出力:

-rw-r--r-- 1 Plasser pis 1008 2012-03-31 15:10 lutsbuf.c 
-rwxr-xr-x 1 Plasser pis 8877 2012-03-31 15:11 a.out 
[email protected]$ ./a.out lutsbuf.c 
In Copy_file_to_buf 
SIZE OF THE FILE=1008; fread returned 1. 
Strlen(lutser)=1008 

... 
<contents of file> 
... 
+0

rcが0に等しくなっています。 – SlashQB

+0

マニュアルで調べてください。どういう意味ですか? N個のサイズのファイルからN + 1バイトを読み込もうとしています。私の答えを注意深く読んでください。 – wildplasser

+0

rcの値が1になっています。 'Console Output': ' SIZE OF THE FILE = 114688;フリードは1を返した。 ' – SlashQB

1

fseek()の戻り値(および他のすべてのライブラリコールをチェック!)

if (fseek(inputFile, 0, SEEK_END)) perror("seek to end"); 
sizeofFile = ftell(inputFile); 
if (sizeofFile == -1) perror("ftell"); 
0

CopyNewFileはファイルを閉じません。 WriteSubHeadersToFileは必ずしもそうでないかもしれません(フローに追従するのは難しい)。あなたはどのようにしてファイルの "実際の"サイズを決定していますか?

+0

私はviエディタでファイル 'dummyfile'を開くことで '実際の'サイズを見つけました。 – SlashQB

関連する問題