none
关于文件读取突然崩溃的问题 RRS feed

  • 问题

  • 我的目的是从一个以逗号分隔的文本中按行读取数据,再以结构体的形式写入一个二进制文件,代码如下:

     

    1     CFileDialog myfiledlg(TRUE, NULL, "", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, NULL, NULL);  
    2     CString filepath="";  
    3     CString str_all="";  
    4 //  CString str_temp[6]={"","","","","",""};  
    5     CString str_temp1,str_temp2,str_temp3,str_temp4,str_temp5,str_temp0;  
    6     JWMOVE MYJWMOVE;  
    7     int i;  
    8     if(myfiledlg.DoModal()==IDOK)  
    9     {  
    10         filepath=myfiledlg.GetPathName();  
    11     }  
    12     CStdioFile myfile;  
    13     CFile myfile_w;  
    14     myfile_w.Open(filepath.Left(filepath.ReverseFind('\\')+1)+"inputdata.bin",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary,NULL);  
    15     myfile.Open(filepath,CFile::modeRead,NULL);  
    16     while (myfile.ReadString(str_all))  
    17     {  
    18         i=str_all.Find(',');  
    19         str_temp0=str_all.Left(i);  
    20  
    21         strcpy(MYJWMOVE.ptype,(LPSTR)(LPCTSTR)str_temp0);  
    22           
    23     //  MYJWMOVE.ptype=str_temp[0]  
    24         str_all=str_all.Right(str_all.GetLength()-i-1);  
    25     //  MessageBox(MYJWMOVE.ptype);  
    26  
    27         i=str_all.Find(',');  
    28         str_temp1=str_all.Left(i);  
    29         strcpy(MYJWMOVE.angle,(LPSTR)(LPCTSTR)str_temp1);  
    30     //  MYJWMOVE.angle=str_temp[1];  
    31         str_all=str_all.Right(str_all.GetLength()-i-1);  
    32  
    33         i=str_all.Find(',');  
    34         str_temp2=str_all.Left(i);  
    35         MYJWMOVE.x=atof(str_temp2);  
    36         str_all=str_all.Right(str_all.GetLength()-i-1);  
    37  
    38         i=str_all.Find(',');  
    39         str_temp3=str_all.Left(i);  
    40         MYJWMOVE.y=atof(str_temp3);  
    41         str_all=str_all.Right(str_all.GetLength()-i-1);  
    42  
    43         i=str_all.Find(',');  
    44         str_temp4=str_all.Left(i);  
    45         strcpy(MYJWMOVE.speed,(LPSTR)(LPCTSTR)str_temp4);  
    46     //  MYJWMOVE.speed=str_temp[4];  
    47         str_all=str_all.Right(str_all.GetLength()-i-1);  
    48  
    49     //  i=str_all.Find(',');  
    50         str_temp5=str_all;  
    51 //      MYJWMOVE.distric=str_temp[5];  
    52         strcpy(MYJWMOVE.distric,(LPSTR)(LPCTSTR)str_temp5);  
    53  
    54         myfile_w.Write(&MYJWMOVE,sizeof(JWMOVE));  
    55  
    56  
    57     }  
    58     myfile.Close();  
    59     myfile_w.Close(); 
    读取第一行数据没有问题,但当读取第二行时,程序崩溃,跟踪了一下读取第二行,运行到        str_temp0=str_all.Left(i);程序就崩溃了,不知道为什么,烦请高人指点一下。我把第二行数据删掉,它读取到新的第二行时还是崩溃。
    阿荣
    2009年3月16日 9:53

答案

  • 感谢楼上各位的热心回答,问题暂时解决了,竟然是这句有问题:
    JWMOVE MYJWMOVE;
    但是我的结构体是这样声明的:
    typedef struct JW_MOVE
    {
    .....
    }JWMOVE;
    我把上面那句JWMOVE MYJWMOVE;
    改成struct JW_MOVE MYJWMOVE就没有问题了,奇怪
    阿荣
    2009年3月17日 1:09

全部回复

  • i=str_all.Find(',');  
    str_temp0=str_all.Left(i);  
    如果读出的那行没有','那么i就会是-1,str_all.Left(i);  就会访问错误。

    2009年3月16日 10:02
    版主
  • 关键是我跟踪的时候,i 的值都是有的,并且是正值
    阿荣
    2009年3月16日 10:12
  • 用CString::Tokenize。
    MSMVP VC++
    2009年3月16日 17:41
    版主
  •  试试把循环内

    i=str_all.Find(',');  
    str_temp0=str_all.Left(i);  

    后面的代码注释掉,看看是否还会错误

    2009年3月17日 0:54
    版主
  • 感谢楼上各位的热心回答,问题暂时解决了,竟然是这句有问题:
    JWMOVE MYJWMOVE;
    但是我的结构体是这样声明的:
    typedef struct JW_MOVE
    {
    .....
    }JWMOVE;
    我把上面那句JWMOVE MYJWMOVE;
    改成struct JW_MOVE MYJWMOVE就没有问题了,奇怪
    阿荣
    2009年3月17日 1:09
  • 能帮忙改成这个
    试一下吗
     typedef struct STRUCT_JW_MOVE
    {
    .....
    }JWMOVE;
    然后下面用的时候改成
    JWMOVE MYJWMOVE;
    2009年3月17日 3:12
    版主
  • 我刚刚试了下,依然会出现崩溃的问题
    阿荣
    2009年3月17日 3:20
  • 进一步的发现:
    我原先定义的结构体为了保证位数的统一,是这样定义的:
    #pragma pack(push)
    #pragma pack(2)
    typedef struct JW_MOVE{
      char ptype[4];
      char angle[4];
      double x;
      double y;
      char speed[4];
      char distric[6];
     }JWMOVE;
    #pragma pack(pop)
    然后使用JWMOVE MYJWMOVE;就会出现崩溃的问题,但是改成struct JW_MOVE MYJWMOVE就没有问题了

    现在是我把结构定义中的
    #pragma pack(push)
    #pragma pack(2)
    #pragma pack(pop)去掉了,再使用JWMOVE MYJWMOVE;这句时,也没有问题了
    请高人帮忙解释一下
    阿荣
    2009年3月17日 3:25