无法将文件内容复制到缓冲区

时间:2012-03-31 12:03:43

标签: c

Operating System Used:Ubuntu 11.04
Compiler Used: GCC

程序相关文件:Git Hub Link

当我编译.c文件时,我正在尝试一个可以完成工作的实现程序,与CPP(C预处理程序)相同。

在此特定代码中,Copy_file_to_buf函数不会将整个文件复制到缓冲区中。 实际大小为117406C,但在copy_file_to_buf函数中为ftell,显示为114689

  

编辑:   使用相同的程序将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;
}

4 个答案:

答案 0 :(得分:1)

您要求fread长时间阅读一个sizeofFile块。如果它无法读取大小的块将失败并返回零。相反,您最好请求1个字节长的sizeofFile个块。然后它会准确报告它设法读取的字节数,由于多种原因,可能会少于sizeofFile

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

在你的情况下,它总是少于sizeofFile因为你之前增加了它,所以从来没有要读取sizeofFile个字节。您应该已经读取了文件大小而不是缓冲区大小,但是在任何情况下读取一个字节的多个块仍然是可取的。事实上,我会建议以下更改:

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 :(得分: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;
}

更新:用于测试添加的主要+包括......

#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
Plasser@Pisbak$ ./a.out lutsbuf.c
In Copy_file_to_buf
SIZE OF THE FILE=1008; fread returned 1.
Strlen(lutser)=1008

... 
<contents of file>
...

答案 2 :(得分:1)

检查fseek()(以及所有其他库调用!)的返回值

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

答案 3 :(得分:0)

CopyNewFile不会关闭其文件。 WriteSubHeadersToFile可能并不总是(很难遵循流程)。你是如何确定文件的“真实”大小的?