【发布时间】:2012-10-31 04:49:40
【问题描述】:
我正在尝试使用我在 C++ 中学到的关于文件和资源处理的知识:我想编写一个类似diff 的实用程序。
这是我的最新版本
#include <iostream>
#include <cstdlib>
#include <fstream>
int main(int argc, char* argv[])
{
if(argc!=3)
{
std::cout << "error: 2 arguments required, now exiting ..." << std::endl;
exit (EXIT_FAILURE);
}
std::ifstream file_1(argv[1]);
std::ifstream file_2(argv[2]);
if( file_1.fail() || file_2.fail() )
{
std::cout << "error: can't open files, now exiting ..." << std::endl;
exit (EXIT_FAILURE);
}
std::string dummy_1;
std::string dummy_2;
while(!file_1.eof()) // dummy condition
{
std::getline(file_1,dummy_1);
std::getline(file_2,dummy_2);
std::cout << ((dummy_1==dummy_2) ? "= " : "# ") << dummy_1 << std::endl << " " << dummy_2 << std::endl;
}
return(0);
}
这是我的指导方针:
- 比较 2 个文件
- 用户必须将这 2 个文件的名称直接传递给可执行文件,只有这 2 个参数
- 尽可能多地涵盖 C++ 中的错误处理
- 尽量避免特定平台的步骤或不可移植的代码
我的实际问题是我不知道如何有效地改善我的虚拟状态。 现在,while 迭代只遵循第一个传递文件的长度,我想显然在两个文件中一直向下走并解决这个问题,而不会引入额外的 cicle 之类的过度杀伤力来获取和比较这两个文件的长度进行真正的比较。
我也想知道我的方法是否安全。
最终我也可以接受提出使用 boost 库的解决方案的答案,因为它们非常便携,而且我已经知道我会出于其他原因使用它们。
谢谢。
【问题讨论】:
-
您所写的是一个很好的开始。您可能希望提供更详细的错误消息,例如通过分别检查每个文件的
fail()并告诉用户哪个文件无法打开,或者告诉用户哪个文件先结束。 -
@AdamLiss 我还注意到
exit()函数是C++ 的C 标准库的一部分,也就是cstdlib,这是一种真正的C++ 处理退出程序的方式吗?我的主要问题是确保应用程序能够工作并且它是可移植的,我很懒,我故意延迟了一堆额外的检查和std::cout:! -
@user1802174:
exit()如果您想从任何点显式终止程序,则很好,并且还为您提供了使用数字代码退出的选项,该代码可以从 Windows 下的批处理文件中读取. -
两个文本文件的差异是一个不小的问题。 en.wikipedia.org/wiki/Diff
-
@LokiAstari 这就是为什么我想开始对此进行深入分析,我将不得不处理很多文件,我也很好奇为什么这看起来微不足道,但事实并非如此。跨度>
标签: c++ boost diff file-comparison