2017-12-15 24 views
0

처음으로 포스터입니다. 나는 아직도이 포럼 유형을 배우고 있습니다.C++ 파일에서 가져온 데이터에서 문자열 검색이 실패합니다.

내 코드는 "dataset.txt"파일에서 데이터를 가져 오도록 고안되었습니다. 그것은 그것을 읽고, 그것을 나의 배열로 섭취하고 명령에 표시 할 수 있습니다.

내가 dataset.txt에서 가져온 배열 내의 항목을 검색하려고하면 문제가 발생합니다. 내 코드는 거기에 있다는 것을 읽을 수없는 것 같아서 일치하는 결과를 표시하지 않습니다.

내 모든 데이터는 더미 데이터를 생성하는 데 사용 된 웹 사이트의 "더미 데이터"입니다. 이 출력 무엇

#include <cstdlib> 
#include <iostream> 
#include <string> 
#include <algorithm> 
#include <iomanip> 
#include <fstream> 
#include <stdio.h> 
#include <vector> 

using namespace std; 

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

    int ArraySize = 100; // sets array to 100 items 

    // initializes all possible arrays in the contact manager 
    string LastName[ArraySize] = "no data"; 
    string FirstName[ArraySize] = "no data"; 
    string Phone[ArraySize] = "no data"; 
    string Email[ArraySize] = "no data"; 
    string NullOne = ""; 

    // Designed to pull data from the file "dataset.txt" 

    int i = 1; 

    std::ifstream myfile; 
    myfile.open("dataset.txt", ios::in); 

    if(!(myfile.is_open())) { 
     cout << "Error Opening File" << endl; 
    } 
    else { 
     cout << "File can be read. Will pull data." << endl; 
    } 

    while(myfile.good()) 
    { 
     getline(myfile, NullOne); 
     getline(myfile, LastName[i]); 
     getline(myfile, FirstName[i]); 
     getline(myfile, Phone[i]); 
     getline(myfile, Email[i]); 

     i++; 
    } 

    cout << "Data pull complete!" << endl; 

    myfile.close(); 

    // Designed to search all data for a specified name string 

    string NameSearch = "null"; 
    int Matches = 0; // indicates that there is a match at all 

    cout << "Search for name" << endl; 
    cout << "Please input name : " << endl; 
    cout << LastName[4] << endl; // gives me a search parameter to use 
    cin >> NameSearch; 


    // search for the name in the Name array 

    for(int i=0; i<ArraySize; i++) { 
     cout << LastName[i] << endl; 
     if (LastName[i] == NameSearch) { 
      cout << "Name : " << LastName[i] << endl; 
      cout << "Phone : " << Phone[i] << endl << endl; 
      Matches++; 
     } 
    } 

    if (Matches == 0) { 
     cout << "No matches found" << endl << endl; 
    } 
    else { 
     cout << Matches << " matches found" << endl << endl; 
    } 

    return 0; 
} 

은 다음과 같습니다

Chaney 
Penelope 
(518) 996-0514 
[email protected] 

나는이 더러운 방법임을 알고 나는 그것을 청소하는 계획을 가지고 :

File can be read. Will pull data. 
Data pull complete! 
Search for name 
Please input name : 
Chaney 
Chaney 
no data 
Walton 
Young 
English 
Chaney 
Carpenter 
Castaneda 
Potter 
Blackwell 
Carter 
Dyer 
Yates 
Bentley 
Pitts 
Dawson 
Christensen 
Goodwin 
Boone 
Dunn 
Booth 
Holman 
no data (it displays this for about 40 more lines, I cut it out) 
No matches found 

이 찾을 것을 경기입니다 그러나 나는 그것을 작동시킬 수 없다.

모든 도움을 주시면 대단히 감사하겠습니다.

+2

'std :: find'를 사용해야합니다. –

+1

표시된 코드에 여러 가지 기본 버그가 있습니다. 'string LastName [ArraySize]'- 가변 길이 배열은 표준 C++가 아닙니다. while (myfile.good()) - [while (! myfile.eof())와 같은 근본적인 버그는 항상 버그입니다.] (https://stackoverflow.com/questions/5605125/why-is-iostreameof- inside-a-loop-condition-considered-wrong)에 대해 설명합니다. 'int i = 1;'- 첫 번째 루프는 인덱스 1에서 시작하는 배열을 채우기 시작하지만'for (int i = 0; ...')는 배열 인덱스 0에서 시작하여 1 대신 인덱스 배열을 시작합니다. 디버거를 사용하여 코드를 단계별로 실행하고 런타임에 모든 배열의 내용을 확인하십시오. –

+1

가변 길이 배열을 허용하도록 설정을 끄고 프로그래머가 설정 (따라서 그것을 알고 C++이 표준이 아니라는 것을 정확히 알고있는 프로그래머 만이 그것을 사용할 것입니다.) 포스터가 너무 많습니다. 대부분 C++의 초보자 들이며,'string LastName [ArraySize]', 그들이 유효한 C++ 코드를 작성하고 있다고 믿고 있습니다. 대신에 무엇을 사용할 지에 관해서는'std :: vector '을 사용하십시오. – PaulMcKenzie

답변

0

파일에서 읽는 문자열 끝에 캐리지 리턴 \r 문자를 가져 오는 것처럼 보입니다.

std::getline

는 최대 읽을 수는 있지만 라인 문자 \n의 끝을 제외하고 (예를 들어 cppreference에서 두 번째 항목 참조)하지만, Windows에서 텍스트 파일은 일반적으로 두 개의 문자 시퀀스 \r\n와 라인을 종료 할 것입니다.

읽은 문자열의 마지막 문자가 실제로 \r과 같은지 확인하여 문제인지 확인할 수 있습니다. 그렇다면 마지막 문자를 예를 들어 pop_back 문자열로 트리밍하여 수정할 수 있습니다.