我无法将代码存储到两个不同的阵列中。以下文本文件包含如下格式: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;
}
答案 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;
}