读取文本文件并存储到两个不同的数组中:字符串数组和浮点数组

时间:2017-03-12 19:04:52

标签: c++ arrays file-io

我无法将代码存储到两个不同的阵列中。以下文本文件包含如下格式:name,1,2,3,4,5anothername,6,7,8,9,10 ...

例如它可能是这样的,我将它命名为test.txt:

Drake,1,2,3,4,5
Kanye West,6,7,8,9,10
Ka,11,12,13,14,15,16
Young Thug,17,18,19,20
Kendrick Lamar,21,22,23,24,25

到目前为止,这是我的代码:

#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;

int main(){
    ifstream inputFile;
    inputFile.open("test.txt");

    if (inputFile.fail()){
        cout << "File open error!" << endl;
        return -1;
    }

    string namesarray[25];    //array used to store names
    float numbersarray[25];    //array used to store numbers
    string line;    //string used to read text file
    int i = 0;    //counter for entire text input
    int j = 0;    //counter for namesarray
    int k = 0;    //counter for numbersarray

    while(getline(inputFile, line, ',')){
        if (line[i] >= 'A' && line[i] <= 'Z'){
            namesarray[j] = line;
            j++;
        }
        else{
            numbersarray[k] = stof(line);
            k++;     
        }
        i++;
    }
    inputFile.close();
}

我的问题是我无法将所有名称存储到字符串数组中,但数字存储在float数组中就好了。我的代码只存储在名字中,然后是随机数。例如,如果我创建一个循环来检查名称或数字是否正确存储

for (int a = 0; a < 25; a++){
    cout << numbersarray[a] << endl;
}

这些数字存储得很好,但检查名称并不存储所有名称。如果我检查该行的第一个字母,如果它包含一个字母,它不应该存储在那里吗?我不想使用isalpha(),因为它仍然会输出相同的问题。

for (int a = 0; a < 25; a++){
    cout << namesarray[a] << endl;
}

5 个答案:

答案 0 :(得分:1)

使用getline()时,第三个参数不会删除逗号。它指定了函数填充字符串的分隔符。因此,根据您的输入文件,它将获取名称。

答案 1 :(得分:1)

我找不到使用private void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { //make sure it is not the header row if(e.Row.RowType == DataControlRowType.DataRow) { // whatever your condition if(e.Row.Cells[0].Text == "Whatever") { e.Row.BackColor = Drawing.Color.Red // This will make row back color red } } } 。你总是需要寻找i++;

我建议使用line[0]检查它是数字还是字符

您的代码存在的问题是您只检查大写字母。 大写字母仅存在于具有名称的字符串的第一个字符中。 因此,当isdigit(line[0])转到i++;时,i>0会停止为大写,并成为小写。

另外,我想让您知道line[i]仅适用于c ++ 11

答案 2 :(得分:1)

getLine函数的分隔符是逗号,因此当它到达每个名称的最后一个数字时,它会读取一个字符串中的数字和名称。要修复它,请考虑以下内容:

bool letter = true;
bool letterNum = false;
int index = 0;
if((line[0] >= '9' && line[0] >= '0') || line[0] == '.') {
    letter = false;
}
for(int l = 0; l < line.length()) {
    if((letter && ((line[l] >= '9' && line[l] >= '0') || line[l] == '.')) || (!letter && !((line[l] >= '9' && line[l] >= '0') || line[l] == '.'))) {
        index = l;
        l = line.length();
    }
}

if(letter && index == 0) {
    namesarray[j] = line;
    j++;
    i++;
}

if(!letter && index == 0) {
    numbersarray[k] = atoi(line);
    k++;
    i++;
}

if(letter && index != 0) {
    namesarray[j] = line.substr(0, index);
    numbersarray[k] = stof(line.substr(index, line.length() - index));
    j++;
    k++;
    i += 2;
}

if(!letter && index != 0) {
    numbersarray[k] = stof(line.substr(0, index));
    namesarray[j] = line.substr(index, line.length() - index);
    j++;
    k++;
    i += 2;
}

而不是:

if (line[i] >= 'A' && line[i] <= 'Z'){
    namesarray[j] = line;
    j++;
}
else{
    numbersarray[k] = stof(line);
    k++;     
}
i++;

在while循环中。您也可以使用ifstream >> string,因为它一次读取一行,您可以解析逗号之间的每个子字符串。这可能看起来像:

#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;

int main(){
    ifstream inputFile;
    inputFile.open("test.txt");

    if (inputFile.fail()){
        cout << "File open error!" << endl;
        return -1;
    }

    string namesarray[25];    //array used to store names
    float numbersarray[25];    //array used to store numbers
    string line;    //string used to read text file
    int i = 0;    //counter for entire text input
    int j = 0;    //counter for namesarray
    int k = 0;    //counter for numbersarray

    while(!inputFile.eof()){
        string data;
        inputFile >> data;
        int lastIndex = 0;
        for(int l = 0; l < data.length(); l++) {
            if(data[l] == ',' || l == data.length() - 1) {
                line = data.substr(lastIndex, l - lastIndex);
                lastIndex = l + 1;
                if (((line[l] >= '9' && line[l] >= '0') || line[l] == '.')){
                    numbersarray[k] = stof(line);
                    k++;    
                }
                else{
                    namesarray[j] = line;
                    j++;
                }
                i++;
            }
        }
    }
    inputFile.close();
}

但是,这只适用于每个名称及其数字由\n分隔的情况。如果是,这是更好的选择。但如果不是,请使用第一种方法。

答案 3 :(得分:0)

为什么在else语句中是i ++?你必须检查数组的i变量的第一个元素,但不是它的添加。

答案 4 :(得分:0)

使用std::getline()读取整行,然后std::istringstream解析每一行,可以更好地处理,例如:

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>

using namespace std;

int main()
{
    ifstream inputFile;
    inputFile.open("test.txt");
    if (!inputFile)
    {
        cout << "File open error!" << endl;
        return -1;
    }

    string namesarray[25]; //array used to store names
    float numbersarray[25*5]; //array used to store numbers
    string s; //string used to read text file
    int i = 0; //counter for entire text input
    int j = 0; //counter for namesarray
    int k = 0; //counter for numbersarray

    while (getline(inputFile, s))
    {
        istringstream iss(s);
        getline(iss, namesarray[j], ',');
        ++j;

        while (getline(iss, s, ','))
        {
            numbersarray[k] = stof(s);
            ++k;
        }

        ++i;
    }

    inputFile.close();
    return 0;
}