说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

帮忙看一下一小段简单代码(在线等待)

编辑:说三道四文库 发布时间:2018-07-18 10:36
HTML文档下载 WORD文档下载 PDF文档下载
FILE *txtfile;
    //int number=0;
    //CarDBIDNewMax=1;
    AnsiString  CurrtxtFileName=NULL;
    OpenDialog1->Title = "打开导入txt文件";
    OpenDialog1->Filter = "txt文件 (*.txt)|*.txt";
    if (!OpenDialog1->Execute())
        return;
    CurrtxtFileName = OpenDialog1->FileName;
    if ((txtfile = fopen(CurrtxtFileName.c_str(), "r"))== NULL)
    {
        Application->MessageBoxA("打开txt文件错误!","参数输入");
        return;
    }

    int FileSize=0;
    fseek(txtfile,0,SEEK_END);
    FileSize=ftell(txtfile);
    AnsiString TextfileStr="";


    if(fread(TextfileStr.c_str(),FileSize,1,txtfile)!=1)
    {

        ShowMessage("读导入文件错误!");
        return;
    }
为什么总是不能成功读出文件内容
代码目前运行情况:
能打开文件,能得到FileSize,但到了fread函数时不能成功返回,

计算出大小之后必须把文件指针返回到开始
fread前添加
fseek(txtfile,0,0);
还是不行啊 
我都快疯掉了 就这么几行代码 居然怎么也找不错为什么不能正常执行
fseek(txtfile,0,SEEK_END);
fseek(txtfile,0,SEEK_SET);

参数写反了

应该
fseek(txtfile,SEEK_END,0);
fseek(txtfile,SEEK_SET,0);
修改为:
FILE *txtfile;
AnsiString  CurrtxtFileName = NULL;
OpenDialog1->Title = "打开导入txt文件";
OpenDialog1->Filter = "txt文件 (*.txt)|*.txt";
if (!OpenDialog1->Execute())
   return;
CurrtxtFileName = OpenDialog1->FileName;
if ((txtfile = fopen(CurrtxtFileName.c_str(), "r")) == NULL)
{
    Application->MessageBoxA("打开txt文件错误!", "参数输入");
   return;
}

int FileSize = 0;
fwrite(OpenDialog1->Title.c_str(), strlen(OpenDialog1->Title.c_str()) + 1, 1, txtfile);//修改的地方
fseek(txtfile, 0, SEEK_END);
FileSize = ftell(txtfile);
char buf[20];
if (fread(buf, FileSize + 1, 1, txtfile) != 1)
{
    ShowMessage("读导入文件错误!");
    return;
}


fseek(txtfile,0,SEEK_END);
fseek(txtfile,0,SEEK_SET);
对的。抱歉
AnsiString TextfileStr="";


    if(fread(TextfileStr.c_str(),FileSize,1,txtfile)!=1)
    {

        ShowMessage("读导入文件错误!");
        return;
    }

老大,偶第一次看到c_str()的这种用法,以前讨论过多次c_str()的问题,没想到还有更新奇的.
AnsiString的c_str()不是这么用的,你得自己分配一个buffer来读文件内容.
c_str()返回的是AnsiString内部保存字符串数据的buffer指针,一般而言我们仅仅只能读取这个buffer而不能写入,因为这是由AnsiString类自己管理的,并且随时会发生内存的重新分配(如向AnsiStinrg对象赋予一个更长的字符串,那么buffer会被释放掉并重新分配一块更大的存贮区,原来的char*指针就无效了),因此在c_str()的用法中往往是随用随call,绝不能将其保存在一个char*中以后使用,至于楼主的用法就更没有道理了,你的AnsiString对象初值为"",其内部buffer根本装不下FileSize字节的数据.所以,你只能new一个FileSize+1的新字符串来读文件,使用后再delete
楼主只需要读1个字节,那么可以直接分配一个字符数组了,如果是要读整个文件,就这样:

FILE *txtfile;
    //int number=0;
    //CarDBIDNewMax=1;
    AnsiString  CurrtxtFileName=NULL;
    OpenDialog1->Title = "打开导入txt文件";
    OpenDialog1->Filter = "txt文件 (*.txt)|*.txt";
    if (!OpenDialog1->Execute())
        return;
    CurrtxtFileName = OpenDialog1->FileName;
    if ((txtfile = fopen(CurrtxtFileName.c_str(), "r"))== NULL)
    {
        Application->MessageBoxA("打开txt文件错误!","参数输入");
        return;
    }

    int FileSize=0;
    fseek(txtfile,0,SEEK_END);
    FileSize=ftell(txtfile);

    fseek(txtfile,0,SEEK_SET);//这句不能少

    char buffer[2];//如果要读整个文件,那么改为char *buffer=new char[FileSize+1];

    if(fread(buffer,2,1,txtfile)!=1)//如果要读整个文件,那么把2改为FileSize
    {

        ShowMessage("读导入文件错误!");
        return;
    }

    AnsiString TextfileStr=buffer;

    //delete [] buffer;//如要读整个文件加这一句
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘