在 vc++ 中删除文件的元素

Posted

技术标签:

【中文标题】在 vc++ 中删除文件的元素【英文标题】:Deleting Elements of a file in vc++ 【发布时间】:2017-06-05 09:23:59 【问题描述】:
CStringArray myArray;
myArray.copy(copiedsomeelements);
CString file1="myfile1";
CString file2="myfile2";
FILE *fp1,*fp2;
CString linetocompare="mytext";
fp1 = fopen(myfile1, "rb");
fread(data, 1280, 1, fp1);
fclose(fp1);
TCHAR * pch = _tcstok(data, _T("\r\n"));


fp2 = fopen(myfile2, "w"); //open new file

for (int m = 0; m < myArray.GetCount(); m++)

        CString temp(pch);
        if (strcmp(myArray.GetAt(m), linetocompare) != NULL)
        
                fprintf(fp2, "%s", temp); 
                fwrite("\r\n", 1, 1, fp2);
        
        pch = _tcstok(NULL, _T("\r\n"));

fclose(fp2);
remove(myfile1); //remove old file
rename(myfile2, myfile1);

上面的代码对我来说很好,但不是一直都很好。有时它会直接写入“myfile2”而不比较“linetocomapare”元素。 请帮我解决一下这个。 让我知道是否需要任何澄清。谢谢。

【问题讨论】:

您正在读取任意数据块。例如,那些不需要包含完整的"\r\n" 序列,也不能保证您的搜索项不会跨越连续的块。由于这个问题被标记为c++,你应该使用C++。即:std::getline。不过,这段代码中还有很多错误。请查阅您的入门书籍。 感谢您帮助我改进。 【参考方案1】:

MFC 有一个CStdioFile 类,它封装了几乎所有的 FILE 内容并可以处理换行符。以下是一些用于加载/保存文本文件的便捷功能:

void ReadTextFileContents(CString const& filePath,
    CArray<CString>& lines,
    UINT openFlags = CFile::modeRead | CFile::shareDenyWrite)

    CStdioFile file(filePath, openFlags);

    try
    
        CString line;
        while (file.ReadString(line))
            lines.Add(line);
        file.Close();
    
    catch (...)
    
        file.Abort();
        throw;
    


void WriteTextFileContents(CString const& filePath,
    CArray<CString> const& lines,
    UINT openFlags = CFile::modeCreate | CFile::modeWrite |
    CFile::shareExclusive)

    CStdioFile file(filePath, openFlags);

    try
    
        for (INT_PTR i = 0, count = lines.GetCount(); i < count; ++i)
        
            file.WriteString(lines[i]);
            if (i < (count - 1))
            
                // NOTE: The default mode for CStdioFile is text mode
                // MSDN: Text mode provides special processing for carriage
                // return-linefeed pairs. When you write a newline character
                // (0x0A) to a text-mode CStdioFile object, the byte pair
                // (0x0D, 0x0A) is sent to the file. When you read, the
                // byte pair (0x0D, 0x0A) is translated to a single 0x0A
                // byte.
                file.WriteString(_T("\n"));
            
        
        file.Close();
    
    catch (...)
    
        file.Abort();
        throw;
    

现在你可以这样做了:

    try
    
        CArray<CString> lines;
        ReadTextFileContents(fileName, lines);

        // Do what you want with lines, remove items, copy to
        // another array, etc.

        // Now write them somewhere
        WriteTextFileContents(fileName2, lines);
    
    catch (CException* ex)
    
        // Grab and display error message here
        //ex->GetErrorMessage();

        ex->Delete();
    

【讨论】:

以上是关于在 vc++ 中删除文件的元素的主要内容,如果未能解决你的问题,请参考以下文章

使用 VC++ 删除文件夹的内容

VC程序快速删除自己(可能做升级程序的时候有用)

php Visual Composer - 删除我们不使用的VC元素

如何在VC++6.0下删除一个按钮控件?

在vc中,用fclose关闭一个文件后,再直接读取文件,显示文件正在运行,请高手指点?

Visual Studio 2015 自动生成 的大文件xxx.vc.db的删除问题