1

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

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

4

2 回答 2

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 是制表符的十六进制等等, fread 期望文件中的值是二进制格式,至少正如你在上面写的那样,12 将存储为 0x0001 (或任何你的字节序和大小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; 
}
于 2013-11-07T05:52:52.687 回答
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;
}
于 2013-11-07T06:06:28.057 回答