1

我正在为一个更大的程序验证一个数据文件。我在代码的最后一部分,并试图通过字符串本身确保两个单独的数组彼此“相等”。我已经包含了我最近尝试的代码。请原谅我,因为我已经发布了整个功能。

这里是:

//
//  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 回答