我是从文件中读取数据的新手。我试图从文本文件中获取数据并使用下面的代码打印它们。但是我得到的只是垃圾值。必须输入以下数据
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
答案 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;
}