【问题标题】:C++ How do I delete a new line from the end of a text file?C++ 如何从文本文件的末尾删除一个新行?
【发布时间】:2013-05-02 03:43:31
【问题描述】:

我正在从文本文件中删除一行,方法是将除用户指定的要删除的那一行之外的每一行复制到一个新的文本文件 (temp.txt),然后删除原始文本文件(staffMembers.txt) 并将 temp.txt 重命名为 staffMembers.txt。

staffMembers.txt的内容如下:

1 | First Person | Manager | 123.45
2 | Second Person | Full Time | 123.45
3 | Third Person | Casual | 123.45

staffMembers.txt 的内容复制到 temp.txt 时如下:

1 | First Person | Manager | 123.45
2 | Second Person | Full Time | 123.45
3 | Third Person | Casual | 123.45
*** new line ***

有人能解释一下如何防止在文本文件末尾创建新行吗?我的代码如下:

void deleteStaffMember()
{
    outStream.open("temp.txt", ios::app);

    if(outStream.fail())
    {
        cout << "Unable to open temp.txt.\n";
        exit(1);
    }

    inStream.open("staffMembers.txt");

    if(inStream.fail())
    {
        cout << "Unable to open staffMembers.txt.\n";
        exit(1);
    }
    else
    {
        cout << endl << "Please enter a staff members ID to delete: ";
        cin >> deleteLine;

        while(getline(inStream, line))
        {
            string firstCharacter;

            firstCharacter += line[0];

            if (firstCharacter != deleteLine)
            {
                outStream << line << endl;
            }
            else
            {
                inStream.close();

                outStream.close();

                cout << "Error. Unable to find staff member.\n" << endl;

                break;
            }
        }
    }

    inStream.close();

    outStream.close();

    remove("staffMembers.txt");

    rename("temp.txt", "staffMembers.txt");

    cout << "The staff member has been deleted successfully.\n" << endl;

    system("pause");

    system("cls");
}

我无法从 outStream 中删除 endl,因为 temp.txt 是格式如下:

1 | First Person | Manager | 123.452 | Second Person | Full Time | 123.453 | Third Person | Casual | 123.45

【问题讨论】:

    标签: c++


    【解决方案1】:

    使用矢量的更清洁的解决方案

    string line;
    vector<string> lines;
    
    // put all lines into a vector  
    while ( getline(inStream, line) ) {
      lines.push_back( line );
    }
    
    // remove the line begin with character deleLine....   
    std::remove_if( lines.begin(), lines.end(), 
                    [](string &line) { return line[0] == deleteLine; } );
    
    // append newline to every line except last line  
    std::for_each( lines.begin(), line.end() - 1,
                    []( string &line ) { line += '\n'; } );
    
    // write lines to new file
    std::for_each( lines.begin(), line.end(),
                    []( string &line ) { outStream << line; } );
    

    【讨论】:

    • 第二个for_each 可以是copy(lines.begin(), lines.end(), ostream_iterator&lt;string&gt;(outStream));,这对我来说似乎更具描述性。或者你可以省略第一个 for_each 而不是 copy(lines.begin(), lines.end() - 1, ostream_iterator&lt;string&gt;(outStream, "\n")); outStream &lt;&lt; lines.back(); 只是一个偏好问题。
    【解决方案2】:

    稍微改变一下逻辑,像这样:

        bool firstLine = true;
    
        while(getline(inStream, line))
        {
            string firstCharacter;
    
            firstCharacter += line[0];
    
            if (firstCharacter != deleteLine)
            {
                if (!firstLine)
                {
                    outStream << endl;
                }
                outStream << line;
                firstLine = false;
            }
            else
            {
                inStream.close();
    
                outStream.close();
    
                cout << "Error. Unable to find staff member.\n" << endl;
    
                break;
            }
        }
    

    这样我们在每一行之前打印新行,第一行除外。

    【讨论】:

      【解决方案3】:

      代码:

      if (firstCharacter != deleteLine)
      {
          outStream << line << endl;
      }
      

      很可能是罪魁祸首。

      它正在输出行,然后添加'\n',这是'endl'所做的事情之一。

      考虑“line”是空字符串的情况,或者几乎是这样。

      如果你改用这段代码,行为会变得相当明显:

      if (firstCharacter != deleteLine)
      {
          outStream << "{" << line << "}" << endl;
      }
      

      最后,决定你想如何满足最后一行。 yngum的回答很好,建议理解他的代码。

      (提示:'\n'实际上并不意味着“行尾”,它可以解释为“行分隔符”、“新行开始”或“行尾”中的任何一个)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-05
        • 2017-03-27
        • 2022-08-17
        • 2012-01-27
        • 2011-09-09
        相关资源
        最近更新 更多