1

我想知道如何通过文本文件中的文本搜索一行并将其删除。在查看了这个主题之后-->从文本文件中删除特定行?我在 C# 中找到了这段代码:

string line = null;
string line_to_delete = "the line i want to delete";

using (StreamReader reader = new StreamReader("C:\\input")) {
    using (StreamWriter writer = new StreamWriter("C:\\output")) {
        while ((line = reader.ReadLine()) != null) {
            if (String.Compare(line, line_to_delete) == 0)
                continue;

            writer.WriteLine(line);
        }
    }
}

我试图在 C++/CLI 中将其转换为类似的东西:

System::String^ txtfile = L"C:\\Users\\acer\\Desktop\\aaa.txt";
 String^ line = nullptr;
 String^ line_to_delete = "dasdasdasda";

                    using (StreamReader ^reader = gcnew StreamReader(gcnew String(txtfile)) {
                        using (StreamWriter ^writer = gcnew StreamWriter(gcnew String(txtfile),true) {
                         while ((line == reader->ReadLine()) != nullptr) {
                            if (String.Compare(line, line_to_delete) == 0)
                            continue;

                    writer->WriteLine(line);
            }
        }
    }

但由于我还是个新手,所以我做得不对。请注意,我没有创建任何临时文件,我只是想阅读我的文本文件,检测“dasdasdasda”的行并将其删除。有人能告诉我从 C# 转换为 C++/CLI 时我做错了什么吗?

4

2 回答 2

1

与 C#using语句等效的是使用不带^. 这使它使用 RAII。

String^ line = nullptr;
String^ line_to_delete = "the line i want to delete";

StreamReader reader("C:\\input");
StreamWriter writer("C:\\output");

while ((line = reader.ReadLine()) != nullptr) {
    if (String::Equals(line, line_to_delete))
        continue;

    writer.WriteLine(line);
}

需要注意的几点:

  • 当您自己创建对象时,您只能在 C++/CLI 中执行此操作:您不能将它与其他方法的返回值一起使用,就像using在 C# 中一样。
  • 没有^on 变量,我们使用.调用方法,而不是->.
  • 我更正了您String::Compare对 be的使用String::Equals。比较应该只用于排序;要测试相等性,请使用 Equals。
于 2013-08-26T18:18:10.833 回答
1

我从未真正使用过 .Net,但我听说您可以在 Visual Studio IDE 中混合使用两种原生 c++,所以这是我为您解决问题的方法。

/*
 * findLine.cpp
 */

#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

void LineDeleter( string fileName, string line_to_delete )
{
  fstream myFile( fileName.c_str(), ios::in );  // Read from file.
  vector<string> strArray;  // Where we copy line by line.
  // Retrieve line by line.
  while( myFile.good() )
    {
      char buffer[256];
      myFile.getline( buffer, 256 );
      if( line_to_delete != buffer )
    strArray.push_back( buffer );
    }
  myFile.close();

  // Writing session.
  myFile.open( fileName.c_str(), ios::out | ios::trunc );
  for( auto iter = strArray.begin(); iter != strArray.end(); iter++ )
    {
      myFile << *iter << endl;;
      cout << *iter << endl;
    }
  myFile.close();

}
int main( int argc, char **args )
{
  LineDeleter( "text.txt", "(c)2013 All Rights Reserved." );
}

基本上 LineDeleter将接受两个参数,文本文件的文件名和要删除的行的字符串。这将删除与要删除的行匹配的所有行。

对于新请求: 关于删除包含子字符串的行的新请求,代码如下:

void deleteContainingSubString(  string fileName, string subString )
{
  fstream myFile( fileName.c_str(), ios::in );  // Read from file.
  vector<string> strArray;  // Where we copy line by line.
  // Retrieve line by line.
  while( myFile.good() )
    {
      char buffer[256];
      myFile.getline( buffer, 256 );
      string buffer02 = buffer;
      if( buffer02.find( subString ) == string::npos )
    strArray.push_back( buffer );
    }
  myFile.close();

  // Writing session.
  myFile.open( fileName.c_str(), ios::out | ios::trunc );
  for( auto iter = strArray.begin(); iter != strArray.end(); iter++ )
    {
      myFile << *iter << endl;;
      cout << *iter << endl;
    }
  myFile.close();

}

编辑1:我稍微优化了代码。编辑 2:添加了有关新请求的代码。

于 2013-08-26T02:11:41.107 回答