【问题标题】:Providing a file path to an input-dependent program为依赖于输入的程序提供文件路径
【发布时间】:2017-07-10 01:43:38
【问题描述】:

首先,如果标题没有意义,对不起。我的问题的性质使我很难表达。

我正在为我的数据结构课程做作业,由于只在我的老学校学习过 Java,所以我对 c++ 完全陌生。该项目是一个天气记录器,它从文本文件climatedata.txt 中读取数据。我的老师在文件中为我们提供了一个主要功能(我们不允许以任何方式修改)weatherlog.cpp,如下所示。

#include <iostream>
#include <fstream>
#include "datalogger.h"

using namespace std;
int main(int argc, char** argv) {

datalogger dl;

if (argc != 2) {
    cout << "Usage: " << argv[0] << " <datafile>" << endl;
    exit(0);
}

// Read the data

char* datafile = argv[1];
ifstream infile(datafile);
int timestamp;
double temperature;
double windspeed;

while (!infile.eof()) {
    infile >> timestamp;
    infile >> temperature;
    infile >> windspeed;

    if (!infile.eof()) {
        dl.addData(timestamp, temperature, windspeed);
    }
}

// Output the report
dl.printReport();

return(0);
}

最初我很困惑为什么程序永远不会完全执行,直到我弄清楚 argc 是在 main 函数的范围内。似乎他希望我在编译时提供文本文件名,以便argc 将是 2 而不是 1(我在调试时看到的值),以便它可以实际执行程序的其余部分而不是立即退出。

我的问题是我不确定如何为程序提供文本文件位置。我已经查看了整个互联网,但由于我什至不确定在哪个阶段提供文件路径,所以我没有取得任何成功。使用 g++ 编译时是否应该传递该信息?在我尝试运行可执行文件时成功编译后?执行此操作的终端命令是什么样的?

【问题讨论】:

  • 从命令行运行程序:myprogram c:\mypath\climatedata.txt。当我们在这里时,Why is iostream::eof inside a loop condition considered wrong? 点击链接并找出答案。
  • 在我学校的 SSH 服务器上运行程序。当我使用命令./a.out climatedata.txt 运行它时,所有返回的都是Segmentation fault。看来我已经解决了我最初的不知道如何提供文件的问题并取消了另一个问题...
  • 好的开始。现在在 Gnu 调试器 gdb 下运行您的程序。非常方便的程序。在这种情况下,您不必做太多事情,只需运行程序,等待它崩溃,然后使用bt 命令查看崩溃时发生了什么。绝对值得您花时间熟悉gdb 的更高级用法。您现在花费的时间将被多次返还。

标签: c++ file io g++


【解决方案1】:

所以我知道您需要在 argv 中提供文件名(如果我不正确,请在下方评论)。 argv 是命令行传递的参数数组,argc 是传递的参数数量(自动设置)。为此,只需像这样在终端中调用程序:./&lt;progam&gt; &lt;file_name&gt;

例子:

像编写 hello world 程序一样编译。

调用程序weatherlog climatedata.txt

如果您的文件名称中有空格,请删除它们或将其名称括在引号中。

【讨论】:

    【解决方案2】:

    argc存储传入参数的个数,argv指向参数。

    if (argc != 2) 表示检查通过控制台模式传入的输入参数的数量。第一个参数始终是程序名称。从第二个参数你可以传递你想要的任何东西。 char* datafile = argv[1]; 表示将第二个参数作为数据文件名。

    简而言之,打开控制台模式(Windows 上的 CMD,Linux 上的终端)并输入类似:yourprogram C:\path\to\climatedata.txt

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-07
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 2022-06-28
      • 2022-01-01
      • 2016-04-23
      相关资源
      最近更新 更多