2013-04-30 3 views
0

그래서 input.csv 파일 (각 명령에 대해 쉼표와 새 행을 사용하여 분리 된 두 개의 열이있는 텍스트 파일)에서 입력을 읽는 간단한 달력 응용 프로그램 용 프로그램을 만들고 있습니다.왜 내 countlines 함수가 항상 0을 반환합니까?

가장 먼저해야 할 일은 명령 행에서 세 번째 인수로 전달되는 입력 파일의 행 수를 계산하는 것이므로 각 행을 개별적으로 보유 할 수 있도록 배열을 만들 수 있지만 항상 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; 
} 
+0

당신이 파일을 성공적으로 열었 확인합니까? – WhozCraig

+0

죄송합니다! 나는 제목을 잘못 입력했다. 나는 그것을 지금 바꿨다. 입력 파일이 몇 줄이든 관계없이 항상 0을 반환합니다. – SudoSilman

+0

디버깅하여'getline'이 효과가 있다는 것을 확인하십시오. 파일이 열리지 않으면 실패 할 수 있습니다. –

답변

0

당신은 ARGV [3] 널 (null) 인 액세스하려고합니다. 보십시오이 : -

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; 

} 어떤 시점에서

6

당신이 당신의 입력 파일을 열려면 실패하기 때문이다.

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

모든 이유로 파일을 열 수 없으므로 항상 확인해야합니다.

BTW 배열을 사용하여 입력 라인을 유지하지 않으려면 std::vector<std::string>을 사용하십시오. 그런 다음 push_back을 사용하여 벡터를 선에 추가 할 수 있습니다. 파일을 두 번 읽지 않아도되므로 이 더 간편해질 것입니다. 너는 무엇을 더 요구할 수 있 었는가! 이 질문에 말한대로 그것은 당신을 보인다

std::vector<std::string> lines; 
std::string line; 
while (getline(inputfp, line)) 
    lines.push_back(line); 
+0

나는 그것이 어떻게 작동하는지 잘 모르겠지만 그 충고를 살펴 봐야 할 것이다.하지만 충고에 감사 드리며 실제로 파일을 열지 못했다는 것을 보여 주었다. – SudoSilman

+0

당신은 vector와 push_back을 의미합니까? 벡터는 배열과 비슷하지만 동적으로 커지며, push_back은 항목을 벡터의 끝에 추가합니다. – john

+0

와우, 나는 C++을 처음 접했을 정도로 벡터 객체를 본 적이 없다. 이것은 아주 멋지다. 배열과 같은 항목에 액세스 할 수 있습니까? – SudoSilman

2

인수하지 세를 원하는 ("첫 번째"인수는 프로그램 이름입니다). 즉, 입력 파일은 argc[2]이고, argv[3]NULL 포인터입니다.

이것은 사용자의 open 호출이 실패하지만 사용자가 확인하지 않음을 의미합니다.

2

argv[3]에 대한 액세스가 잘못되었습니다. 두 번째 파일 이름 (프로그램 이름을 포함하여 세 번째 arg, arg[0])은 슬롯 2에 있습니다 (배열은 0부터 시작 함).

시도 :

apptsfp.open(argv[1]); 
inputfp.open(argv[2]) 
관련 문제