我的原程序如下:
#include<stdio.h>
#include<math.h>
struct hj
{
char dianh[10];
long int x;
long int y;
char gaoc[10];
}
main()
{
int i;
struct hj d[10];
FILE *fp;
fp=fopen("123.txt","r+");
for(i=0;i<4;i++)
{
d[i].x=0;
d[i].y=0;
fread(&d[i],20,1,fp);
printf("%s %d %d %s\n",d[i].dianh,d[i].x,d[i].y,d[i].gaoc);
printf("ok");
}
fclose(fp);
}
运行的结果不是我想要的结果,总出现一些乱码。我怀疑是文件的问题。
我文件是用excel另存为文本制表符格式的,求教各位高手,如果真是文件问题又应该怎么转换文件呢?
我用fread(&d[i],sizeof(struct hj),1,fp);也是一样的。
我的文件了内容格式为
1-21 2856591 15733334 522 m
2-23 2856564 15732844 521 m
数据读出来是乱码。
fread是一个函数。从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回 0。
函数原型
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
参 数
buffer
用于接收数据的内存地址
size
要读的每个数据项的字节数,单位是字节
count
要读count个数据项,每个数据项size个字节.
stream
输入流
返回值
实际读取的元素个数。如果返回值与count不相同,则可能文件结尾或发生错误。从ferror和feof获取错误信息或检测是否到达文件结尾。
函数原型
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
参 数
buffer
用于接收数据的内存地址
size
要读的每个数据项的字节数,单位是字节
count
要读count个数据项,每个数据项size个字节.
stream
输入流
返回值
实际读取的元素个数。如果返回值与count不相同,则可能文件结尾或发生错误。从ferror和feof获取错误信息或检测是否到达文件结尾。
温馨提示:答案为网友推荐,仅供参考
第1个回答 推荐于2017-11-23
你写入文本文件后,数据是用ASCII码串的形式来表示,已经不是二进制数据了,因此需要用fscanf函数来读取,试试如下程序:
#include<stdio.h>
#include<math.h>
struct hj
{
char dianh[10];
long int x;
long int y;
char gaoc[10];
}
main()
{
int i;
struct hj d[10];
FILE *fp;
char s1[10];
fp=fopen("123.txt","r+");
for(i=0;i<2;i++)
{
fscanf(fp,"%s\t%d\t%d\t%s %s",&d[i].dianh,&d[i].x,&d[i].y,&d[i].gaoc,&s1);
strcat(d[i].gaoc,s1);
}
fclose(fp);
}本回答被提问者和网友采纳
#include<stdio.h>
#include<math.h>
struct hj
{
char dianh[10];
long int x;
long int y;
char gaoc[10];
}
main()
{
int i;
struct hj d[10];
FILE *fp;
char s1[10];
fp=fopen("123.txt","r+");
for(i=0;i<2;i++)
{
fscanf(fp,"%s\t%d\t%d\t%s %s",&d[i].dianh,&d[i].x,&d[i].y,&d[i].gaoc,&s1);
strcat(d[i].gaoc,s1);
}
fclose(fp);
}本回答被提问者和网友采纳
第2个回答 2010-12-16
fread是用二进制方式读取二进制文件,读取的数据必须是用对应的fwrite写入的,而你读取的是文本格式的文件当然就不行了!
你可以试试用fscanf读取。
你可以试试用fscanf读取。
第3个回答 2010-12-16
读取字节出错了 应该是28字节 而不是20 最好用siezof(struct hj)
不要你手动输入数据 最好用程序将数据整块写入文本中 要吗你就用fscanf 和fsprintf对应着来
不要你手动输入数据 最好用程序将数据整块写入文本中 要吗你就用fscanf 和fsprintf对应着来
第4个回答 2010-12-16
fread(&d[i],20,1,fp);这句不是读的
比如 freed(p,20,1,fp) p是一个已经分配的空间的指针 fread(d[j].dianh,10,1,lp);
freed(d[j].gaoc,10,1,lp);
比如 freed(p,20,1,fp) p是一个已经分配的空间的指针 fread(d[j].dianh,10,1,lp);
freed(d[j].gaoc,10,1,lp);