0

所以我正在为一个简单的日历应用程序制作一个程序,该应用程序从文件 input.csv 中读取输入(它是一个文本文件,有两列,每个命令使用逗号和换行符分隔)。

我要做的第一件事是计算输入文件中的行数,它作为命令行中的第三个参数传递,所以我可以创建一个数组来分别保存每一行,但函数 countLines 总是返回 0!

项目代码:

#include<iostream>
#include<string>
#include<fstream>
using namespace std;


//Prototypes
int countLines (ifstream& countfiles);


int countLines(ifstream& countfile)
//counts number of lines in file passed to function
{
   string line;
   int numberOfLines;

   numberOfLines = 0;

   //reads through each line until end of file
   while(getline(countfile, line))
   {
       numberOfLines++;
   }

   return numberOfLines;
}


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

    if(argc != 3) cout << "Usage: calendar.out datafile inputfile";

    //Create input streams to both files
    ifstream apptsfp;
    ifstream inputfp;

    //Open streams to both files
    apptsfp.open(argv[2]);
    inputfp.open(argv[3]);

        int numberOfInputs=0;

    numberOfInputs = countLines(inputfp)-1;

        cout << "number of input commands: " << numberOfInputs << endl;

    return 0;
}
4

4 回答 4

7

几乎可以肯定是因为您无法打开输入文件。

inputfp.open(argv[3]);
if (!inputfp.is_open())
{
    cerr << "failed to open input file " << argv[3] << '\n';
    return 1;
}

文件可能由于各种原因无法打开,您应该经常检查这一点。

顺便说一句,不要使用数组来保存输入行,使用std::vector<std::string>. 然后您可以使用push_back将线条添加到向量中。这将更容易更有效,因为您不必读取文件两次。你还能要求什么呢!

std::vector<std::string> lines;
std::string line;
while (getline(inputfp, line))
    lines.push_back(line);
于 2013-04-30T06:54:24.680 回答
2

似乎您只需要两个参数,而不是您在问题中所说的三个(“第一个”参数是程序名称)。这意味着输入文件在argc[2],并且argv[3]是一个NULL指针。

这意味着您的open呼叫将失败,但您不进行检查。

于 2013-04-30T06:56:36.717 回答
2

您的访问权限argv[3]不正确。第二个文件名(第三个参数,包括 中的程序名arg[0])位于插槽 2 中(数组从零开始)。

尝试:

apptsfp.open(argv[1]);
inputfp.open(argv[2])
于 2013-04-30T06:56:46.023 回答
0

您正在尝试访问argv[3]哪个为空。尝试这个 :-

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

    if(argc != 3)
        cout << "Usage: calendar.out datafile inputfile";

    //Create input streams to both files
    ifstream apptsfp;
    ifstream inputfp;

    //Open streams to both files
    apptsfp.open(argv[1]);
    inputfp.open(argv[2]);

    int numberOfInputs=0;

    numberOfInputs = countLines(inputfp)-1;

    cout << "number of input commands: " << numberOfInputs << endl;

    return 0;
}
于 2013-04-30T07:20:56.693 回答