2017-06-05 94 views
-2
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); 

上述代碼對我來說很好,但並不是所有的時間。有時它會在不比較「linetocomapare」元素的情況下直接寫入「myfile2」。 請幫我這個。 讓我知道是否需要澄清。謝謝。在vC++中刪除文件的元素

+0

您正在閱讀的任意數據塊。例如,那些不需要包含完整的「\ r \ n」序列,也沒有任何保證,您的搜索項不會跨越連續的塊。因爲這個問題被標記爲[tag:C++],所以你應該使用C++。那就是:[std :: getline](http://en.cppreference.com/w/cpp/string/basic_string/getline)。不過,這段代碼中還有更多的錯誤。請參閱您的介紹性書籍。 – IInspectable

+0

謝謝你幫助我改進。 –

回答

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(); 
    }