以二进制模式读取文件

时间:2013-11-07 05:43:00

标签: c binary fopen

我是从文件中读取数据的新手。我试图从文本文件中获取数据并使用下面的代码打印它们。但是我得到的只是垃圾值。必须输入以下数据

12 13 14

代码

void main()
{
    FILE *fp;
    int a=0;
    fp=fopen("try.txt","rb");
    fseek(fp,0,SEEK_END);
    long int size=ftell(fp);
    fseek(fp,0,SEEK_SET);
    for(int i=0;i<size;i++)
    {
        fread(&a,sizeof(int),1,fp);
        printf("%d\t",a);
    }
    fclose(fp);
    getch();
}

但我得到的是以下值

822686257  875628851  875628851  875628851  875628851
875628851  875628851  875628851

我读了与fread有关的其他答案,但我仍然无法理解这个问题。我正在使用visual c ++ 2010 express

2 个答案:

答案 0 :(得分:3)

int main() // note: int
{
 FILE *fp;
 int a=0;
 fp=fopen("try.txt","rb");
 fseek(fp,0,SEEK_END);
 long int size=ftell(fp); // now you got size of file in bytes
 fseek(fp,0,SEEK_SET);    // same as rewind(fp)
 for(int i=0;i<size;i++)
 {
    fread(&a,sizeof(int),1,fp); // you read one int (sizeof(int)!=1 byte)
    printf("%d\t",a);
  }
  fclose(fp);
  getch();
  return 0; // since int main()
}

相反,如果您想从文件中读取整数,则必须更改您阅读的元素数量

for (int i = 0; i < size/sizeof(int); ++i)
{
...
}

编辑:

当你在十六进制中仔细查看你的值时,可以看到一个模式

31093231

31是1的十六进制,09是tab的十六进制等等,fread期望文件中的值是二进制格式,至少在你上面写的那样,12将被存储为0x0001(或任何你的endianess和int的大小是)但是可以看到的是值的ASCII值所以你不应该使用fread()代替使用fgetc():

int main() 
{
 FILE *fp;
 int a=0;
 fp=fopen("try.txt","rb");
 if ( fp != NULL )
 {
   do
   {
     a = fgetc(pFile); // read one character
     if ( a != EOF ) putchar( a );
   }
   while ( a != EOF );
 }

 fclose(fp);
 getch();
 return 0; 
}

答案 1 :(得分:0)

不要把它当作二进制文件。请尝试使用此代码:

int no;
std::ifstream fin("try.txt", std::ios::in|std::ios::beg);
if(!fin)
{
    std::cout<<"Cannot open for reading\n";
    return;
}
while(fin>>no)
{
    std::cout<<no<<std::endl;
}