文件的读写,可以按照结构体写入txt,但是读出来的确不是txt里的数据,不能按照结构体读取

时间:2022-04-24 04:25:47
 

int CFileWandR::ReadDate(int Date_NUM,char * usename,char * password,char * LanIP,int & LanPort,char * WanIP,int & WanPort)
{
FILE *fp;
  int nTime;
  int Flag;
  TUTK_Info File_Date[1000];
  if((fp=fopen("TutkFlie.txt","r+"))==NULL)
  {
  Flag=0;    //如果文件不存在返回0;
     }
     rewind(fp);       // 文件首
  for (nTime=0;nTime<1000;nTime++)
  {
  fscanf(fp,"%s%s%s%d%s%d",File_Date[nTime].usename,&File_Date[nTime].password,&File_Date[nTime].LanIP,File_Date[nTime].LanPort,File_Date[nTime].WanIP,File_Date[nTime].WanPort);

}
  strcpy(usename,File_Date[Date_NUM].usename);
    strcpy(password,File_Date[Date_NUM].password);
    strcpy(LanIP,File_Date[Date_NUM].LanIP);
  LanPort=File_Date[Date_NUM].LanPort;
  strcpy(WanIP,File_Date[Date_NUM].WanIP);
  WanPort=File_Date[Date_NUM].WanPort;
  Flag=1;
  fclose(fp);
return Flag;


}
 

int CFileWandR::WriteDate(int Date_NUM,const char * usename,const char * password,const char * LanIP, int LanPort,const char * WanIP,int  WanPort)
{
FILE *fp;//文件
int index;
  if((fp=fopen("TutkFlie.txt","a+"))==NULL)
  {
index=0;    //如果文件不存在返回0;
}
    TUTK_Info  File_Date[1000]; //1000组数据 
    strcpy(File_Date[Date_NUM].usename,usename);
strcpy(File_Date[Date_NUM].password, password);
strcpy(File_Date[Date_NUM].LanIP, LanIP);
File_Date[Date_NUM].LanPort= LanPort;
strcpy(File_Date[Date_NUM].WanIP, WanIP);
    File_Date[Date_NUM].WanPort=WanPort; 
  fprintf(fp,"%s%s%s%d%s%d\n",File_Date[Date_NUM].usename,File_Date[Date_NUM].password,File_Date[Date_NUM].LanIP,File_Date[Date_NUM].LanPort,File_Date[Date_NUM].WanIP,File_Date[Date_NUM].WanPort);
   index=1;
fclose(fp);
return index;
}

7 个解决方案

#1


fprintf,fscanf 都会以文本方式来读写文件,以文本方式读取会被操作系统的编码影响。最好改成以二进制方式来序列化。

例如写入的时候
fwrite(fp, buff, 10 bytes)
fwrite(fp, buff, 2 bytes)
fwrite(fp, buff, 3 bytes)
...
读取的时候
fread(fp, buff, 10 bytes)
fread(fp, buff, 2 bytes)
fread(fp, buff, 3 bytes)


#2


fprintf(fp,"%s%s%s%d%s%d\n"
%s中不加个空格(话又说回来了,加个空格的话,如果数据本身有空格怎么办,最好的解决办法还是读写进制数据),读的时候怎么分段?

建议用二进制读写数据,速度快,文件小,操作还简单。一条fwrite加一条fread就完成你所有功能了。

#3


会报内存错误,唉

#4


可以贴点代码出来吗?

#5


说这么清楚还要代码?

fp=fopen("TutkFlie.txt","rb"); //"w+b" 写
TUTK_Info info;

//读:
fwrite(&info, 1, sizeof(TUTK_Info), fp);

//写:
fwrite(&info, 1, sizeof(TUTK_Info), fp);

#6



在这里放置你的代码

这样,看起来代码舒服一些,更容易看懂,问题,楼上的都说的差不多了

#7


 

在[/code]前面,
[code=C/C++]后面

#1


fprintf,fscanf 都会以文本方式来读写文件,以文本方式读取会被操作系统的编码影响。最好改成以二进制方式来序列化。

例如写入的时候
fwrite(fp, buff, 10 bytes)
fwrite(fp, buff, 2 bytes)
fwrite(fp, buff, 3 bytes)
...
读取的时候
fread(fp, buff, 10 bytes)
fread(fp, buff, 2 bytes)
fread(fp, buff, 3 bytes)


#2


fprintf(fp,"%s%s%s%d%s%d\n"
%s中不加个空格(话又说回来了,加个空格的话,如果数据本身有空格怎么办,最好的解决办法还是读写进制数据),读的时候怎么分段?

建议用二进制读写数据,速度快,文件小,操作还简单。一条fwrite加一条fread就完成你所有功能了。

#3


会报内存错误,唉

#4


可以贴点代码出来吗?

#5


说这么清楚还要代码?

fp=fopen("TutkFlie.txt","rb"); //"w+b" 写
TUTK_Info info;

//读:
fwrite(&info, 1, sizeof(TUTK_Info), fp);

//写:
fwrite(&info, 1, sizeof(TUTK_Info), fp);

#6



在这里放置你的代码

这样,看起来代码舒服一些,更容易看懂,问题,楼上的都说的差不多了

#7


 

在[/code]前面,
[code=C/C++]后面