1

より大きなプログラムのデータ ファイルを検証しています。私はコードの最後の部分にいて、文字列自体によって 2 つの別個の配列が互いに "等しい" ことを確認しようとしています。最新の試行のコードを含めました。関数全体を投稿しましたので、ご容赦ください。

ここにあります:

//
//  validateDataFile.cpp
//  P1
//
//  Created by xxxxxxx on 3/26/13.
//  Copyright (c) 2013 xxxxxxx. All rights reserved.
//

#include "p1.h"

void validateDataFile (string fileName) {
fstream file;
file.open (fileName.c_str());

if (file.is_open()) {
    unsigned int i, j, x = 0, y = 0, a;
    int flag = 0, check = 0;
    string fileData, word, strg[200];

    getline (file, fileData);

    for (i = 0; i < fileData.length(); i++) {
        if ((fileData[i] == ' ') || (fileData[i] < 48) || (fileData[i] > 57)) {
            cout << "fileData[i]: " << fileData[i] << endl;
            cout << "Incorrect DataFile!\nFirst line should contain a positive"
            " integer and no white space" << endl;
            return;
        }
    }

    int numberOfNodes = convertToInt(fileData);

    string list[numberOfNodes];

    if (numberOfNodes < 0) {
        cout << "Number of Nodes: " << numberOfNodes << endl;
        cout << "Incorrect DataFile!\nFirst character should be a positive"
        "integer" << endl;
        return;
    }

    getline (file, fileData);
    stringstream stream (fileData);

    while (getline (stream, word, ' ')) {
        list[x++] = word;

            for (a = 0; a < numberOfNodes; a++) {
                    cout << "list of nodes: " << list[a] << endl;   //testing only
            }
    }

    if (x != numberOfNodes) {
        cout << "Incorrect DataFile!\nList of strings has more strings than"
        " the number of nodes specified in the first line." << endl;
        return;
    }

    while (!file.eof()){
        getline (file, fileData);
        stringstream ss (fileData);

        while (getline (ss, word, ' ')) {


            if (convertToInt(word) < 0) {
                flag = 0;
                for (i = 0; i < y; i++) {
                    if (strg[i] == word) flag = 1;
                }

                if (flag == 0) strg[y++] = word;
            }
        }
    }

    for (i = 0; i < y; i++) {               //<- my problem starts here
        check = 0;
        for (j = 0; j < x; j++) {
            if (strg[i].compare (list[j]) == 0) {
                check = 1;                  //<- my problem ends here
                break;
            }
        }
    }
    if (check == 0) {
        cout << "Incorrect DataFile!\nStrings listed should match Node Strings" << endl;
        return;
    }
}
else {
    cout << "ERROR!\n DataFile not present." << endl;
    return;
}


file.close();

}

エラーなしでコンパイルされますが、私が望んでいることはしません。

意図的にデータ ファイルを変更してエラーを作成しましたが、何らかの理由でエラーが発生せず、比較が正しくないことがわかります。

ここに私のデータファイルの小さな部分があります:

16
Cape Birmingham Boston Chicago Dallas Detroit KansasCity LosAngeles Memphis Minneapolis Omaha Orlando Richmond SanFrancisco Seattle StLouis 
Atlanta Chicago 718
Atlanta Dallas 781
Atlanta Orlando 439
Birmingham Atlanta 146
Birmingham Detroit 723
Birmingham Richmond 678
Boston Atlanta 1099
Boston Detroit 716
Boston Memphis 1311
Chicago Atlanta 718
Chicago Boston 983
Chicago KansasCity 526

最初の都市を意図的に「アトランタ」から「ケープ」に変更しました。誰かが私のエラーを教えて、それを修正するために何をする必要があるかを教えてもらえますか? ありがとう!

4

2 に答える 2

1

リストに対してチェックしている最後のノードである場合にのみ、悪い値が見つかります。チェックループを次のように変更する必要があります。

for (i = 0; i < y; i++) {               //<- my problem starts here
    check = 0;
    for (j = 0; j < x; j++) {
        if (strg[i].compare (list[j]) == 0) {
            check = 1;                  //<- my problem ends here
            break;
        }
    if( check == 0 ) // value not found, break out of verification loop to report this.
        break;
    }

これにより、チェックされている項目がリストにない場合、すぐに検証が停止します。

于 2013-03-28T21:50:30.317 に答える
0

コードが多すぎて、(私のように) 多くの人が読み始めることすらできません。問題を再現する短いプログラムを作成してみてください。

また、 http: //www.cplusplus.com/reference/string/string/compare を注意深く読むことをお勧めします。

于 2013-03-28T21:42:42.413 に答える