文件内容是一行行写的,现找到一合适的行,要删除它,怎么操作?不是重写文件吧?

解决方案 »

  1.   

    就是重写。
    不过用FILEMAPPING应该会快一点。
      

  2.   

    HANDLE hFile = CreateFile("test.txt", 
      GENERIC_WRITE | GENERIC_READ, 
      FILE_SHARE_READ, 
      NULL, 
      CREATE_ALWAYS, 
      FILE_FLAG_SEQUENTIAL_SCAN, 
      NULL); // 创建文件映射内核对象,句柄保存于hFileMapping 
    HANDLE hFileMapping = CreateFileMapping(hFile,NULL,PAGE_READWRITE, 
    0, 0x4000000, NULL); 
    // 释放文件内核对象 
    CloseHandle(hFile); 
    // 设定大小、偏移量等参数 
    __int64 qwFileSize = 0x4000000; 
    __int64 qwFileOffset = 0; 
    __int64 T = 600 * sinf.dwAllocationGranularity; 
    DWORD dwBytesInBlock = 1000 * sinf.dwAllocationGranularity; 
    // 将文件数据映射到进程的地址空间 
    PBYTE pbFile = (PBYTE)MapViewOfFile(hFileMapping, 
    FILE_MAP_ALL_ACCESS, 
    (DWORD)(qwFileOffset>>32), (DWORD)(qwFileOffset&0xFFFFFFFF), dwBytesInBlock); 
    memcpy( lpAddress, lpBuf, ....);//进行文件写入,要防止内存溢出的情况
    // 从进程的地址空间撤消文件数据映像 
    UnmapViewOfFile(pbFile); 
    // 关闭文件映射对象 
    CloseHandle(hFileMapping);
      

  3.   

    谢谢大家。
    我今天是是按重新写入的方法写的,出现如下问题:
    CStringArray strarray;
    if( !file.Open(m_strPathIndex, CFile::modeRead) )
    {
    return;
    }
    CString strLine;
    while(file.ReadString(strLine))
    {
    strarray.Add(strLine);
    }
    file.Close();
    CString str;
    int nCount=strarray.GetSize();
    strarray.RemoveAt(0);//我每次都是要删除第一条记录,这是肯定的,这句出错
    if( !file.Open(m_strPathIndex, CFile::modeCreate|CFile::modeWrite) )
    {
    return;
    }
    for(i=0; i<strarray.GetSize(); i++)
    {
     str = "";
     str = strarray[i] + "\n";
     file.WriteString(str);
    }
    file.Close();只要删除操作出现,就会造成程序自动退出。以上是在循环中做的,因为要处理一批文件
    名是数字的文件,都是要删除第一行。怎么会这样呢?
      

  4.   

    你这段代码没有问题呀,方便的话可以把程序发到[email protected]我帮你看看
      

  5.   

    CStdioFile file(m_strPathIndex,CFile::modeCreate|CFile::modeReadWrite|CFile::modeNoTruncate);
    file.SeekToBegin();
    file.ReadString(temp);
    file.WriteString("");
    file.Close();
    用空串代替,这样怎么没有效果呢?????而且这样的话下次我就要读第一个不是空串的并把它改成空串,再下次是它的下一个.....
      

  6.   

    CString temp;
    CStdioFile file("e:\\indexD1.txt",CFile::modeCreate|CFile::modeReadWrite|CFile::modeNoTruncate);
    file.SeekToBegin();
    file.ReadString(temp);
    file.WriteString("dfg");
    file.Close();
    MessageBox(temp);
    怎么这样的执行后文件的第一行不变啊?
      

  7.   

    D:\1\2005_03_1614_38_13变成下面:
    dfg1\2005_03_1614_38_13
    如果写入空串的话就没有任何效果,如果解决呢,谢谢各位哦
      

  8.   

    CStdioFile file(m_strPathIndex,CFile::modeCreate|CFile::modeReadWrite|CFile::modeNoTruncate);
    file.SeekToBegin();
    file.ReadString(temp);
    file.WriteString("");
    file.Flush();//Forces any data remaining in the file buffer to be written to the file
    file.Close();
      

  9.   

    file.SeekToBegin();
    file.ReadString(temp);
    file.Seek(-temp.GetLength()-2,CFile::current );
    file.WriteString("");
    file.Flush();
    file.Close();
    temp.Remove('\r\n');
    MessageBox(temp);
    还是不行,没有变化
      

  10.   

    这是我根据你的代码改的,可以到达你的效果:
    CStringArray strarray;
    CStdioFile file;
    CString m_strPathIndex = "c:\\111.txt";
    if( !file.Open(m_strPathIndex, CFile::modeRead) )
    {
    return;
    }
    CString strLine;
    while(file.ReadString(strLine))
    {
    strarray.Add(strLine);
    }
    file.Close();
    CString str;
    int nCount=strarray.GetSize();
    DeleteFile(m_strPathIndex);
    if( !file.Open(m_strPathIndex, CFile::modeCreate|CFile::modeWrite) )
    {
    return;
    }
    for(int i=1; i<strarray.GetSize(); i++)
    {
     str = strarray[i] ;
     file.WriteString(str);
    file.WriteString("\n");
    }
    file.Close();