C ++从cin中删除空行并保存到同一文件

时间:2018-02-07 16:35:29

标签: c++

我的任务的一部分是创建一个程序来读取从命令行传递的文件:inputfile.cpp | ./pg_rmv_empty_lines。 这个(我猜)是因为我之后可以将同一个文件传输给多个程序。

我知道我可以用以下内容读取该文件中的行:

int main()
{
    string line;
    while(getline(cin, line))
    {
        cout << line << endl;
    }

    return 0;
}

我需要做的是删除程序收到的文件中的所有空行,删除这些行,然后保存修改后的文件。

  1. 我不知道需要修改的文件的名称,它是通过&#34; client&#34;
  2. 从命令行传递的
  3. 修改后文件名应保持不变。
  4. 这让我感到困惑,因为我找到的每个例子,人们都会建议包括将文件名硬编码到源代码中的内容,例如outfile.open("movieList.txt",ios_base::app);。在我的情况下,我不知道输入文件的名称。

    请记住,我第一次使用C ++并且已经让我失去了对人性的信念。

3 个答案:

答案 0 :(得分:2)

要获取parse command line arguments所需的文件名。完成后,您提到的示例将用于读取文件中的行。假设文件不大,您可以将其读入内存,使用if语句跳过空行。

一旦你将文件读入内存,你应该关闭它并重新打开以进行写入或重置到开头并写出缓冲区。

如果文件很大并且无法读入内存缓冲区,您只能通过一次执行一行(或有限数量的行)将其拉出来并将结果保存到临时文件中一个不同的名字。之后,您必须删除旧文件并重命名新文件。当然,另一种方式(首先重命名原始文件,然后用旧名称保存新文件)也可以。

答案 1 :(得分:1)

从命令行获取文件名很简单。

#include <iostream>
#include <fstream>
#include <string> // Because why not.

int main(int argc, char** argv) {
    if (argc != 2) {
        return -1; // Indicates error
    }
    std::string filename = argv[1];
    std::ifstream input(filename);

    // Do your stuff...

    return 0;
}

没有更多提示: - )

答案 2 :(得分:-1)

您确定需要使用管道命令吗?我想你想要的是使用命令行参数。也许这篇文章有帮助:

http://www.cplusplus.com/articles/DEN36Up4/

您可以将主要功能定义为:

int main(int argc, char* argv[])
{
...
}

然后argc是给出的命令行参数的数量,argv是参数。第一个参数始终是程序的名称。因此,如果执行myprogram.exe ./pg_rmv_empty_lines,argv [0]将是 myprogram.exe ,而argv [1]将是 ./ pg_rmv_empty_lines

然后,您可以使用它在代码中动态读取该文件,但首先需要打开该文件。例如:

std::ifstream myFile;
std::string lineAsString;
myFile.open(argv[1]);
std::getline(myFile, lineAsString);

... do things with the line

myFile.close();