我的任务的一部分是创建一个程序来读取从命令行传递的文件:inputfile.cpp | ./pg_rmv_empty_lines
。
这个(我猜)是因为我之后可以将同一个文件传输给多个程序。
我知道我可以用以下内容读取该文件中的行:
int main()
{
string line;
while(getline(cin, line))
{
cout << line << endl;
}
return 0;
}
我需要做的是删除程序收到的文件中的所有空行,删除这些行,然后保存修改后的文件。
这让我感到困惑,因为我找到的每个例子,人们都会建议包括将文件名硬编码到源代码中的内容,例如outfile.open("movieList.txt",ios_base::app);
。在我的情况下,我不知道输入文件的名称。
请记住,我第一次使用C ++并且已经让我失去了对人性的信念。
答案 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();