Чтение файлов, переход по строкам и сохранение данных в массиве.

Я новичок в C ++, и у меня проблема с моей программой. Я искал часы и дни, и хотя есть много постов, похожих на этот, я не могу понять, почему моя программа не работает.

У меня есть файл, который содержит данные таким образом.

STRING FLOAT FLOAT

STRING INT

STRING FLOAT FLOAT FLOAT

STRING INT INT

FLOAT

FLOAT

Таким образом, первые несколько строк содержат строку для первого столбца и номер для остальных, а в какой-то момент есть просто число с плавающей точкой.

Мне удалось получить данные там, где начинаются все числа с плавающей точкой, но я не могу понять, как сохранить оставшуюся часть числа в массиве. (Я ЗНАЮ, ЧТО ЭТО БЫЛО БОЛЕЕ ЛЕГКО, ЧТОБЫ СДЕЛАТЬ ЭТО С ВЕКТОРОМ, НО Я ДОЛЖЕН СДЕЛАТЬ ЭТО С Массивами)

Это то, что я сделал.

void getData(string *ext, int size)
{
istringstream is(*ext);
float val;
is >> val;
float *arrVal = new float[10];    // I dont know the size of the Array.

if(typeid(val) == typeid(float))  //IM NOT SURE ABOUT THIS AT ALL. I JUST DON'T KNOW HOW TO GET TO THE LINE WHERE THERE ARE NO STRINGS
{
arr[size] = atof(*ext.c_str());
}                                  // I think this part is why it does not work.

int main()
{
ifstream File("t.txt");
string line;
int nLines(0);
float *arrayValues =  new float[12];if(!inFile)
{
cerr << "Cannot open file." << endl;
return -1;
}
else
{
while(getline(File, line))
{
getValues(&line, nLines);
getPoints(&line);   //this function gets the values of the first lines.

++nLines;

}
}

system("pause");
return 0;
}

В общем, я должен выяснить, как перейти к строке, с которой начинаются все типы с плавающей точкой, и как сохранить их в массиве.
Я уверен, что есть куча ошибок. Я надеюсь, что вы, ребята, получите то, что я пытаюсь сделать. Я действительно везде искал и ничего не могу найти.

Спасибо !!

0

Решение

Когда вы читаете каждый файл, вы получаете данные в виде символа. Так,
— Токенизируйте каждую строку, прочитанную пробелами, используя strtok. Эта логика не работает, если между строкой есть пробелы. Это прекрасно работает, если в вашей строке только одно слово типа «STRRING» или «FLOAT». Это не работает, если ваша строка похожа на «Я гений» 🙂
— Проверяйте каждый токен просто, если условие должно выполнять вашу работу. строки начинаются с [a-z] или [A-Z]. Числа используют [0-9].
-Как только валидиал. выполнить необходимые преобразования, используя atoi или itoa, или другие.

0

Другие решения

Этот скелет пропустит любую строку в файле, которая не является числом с плавающей запятой.

bool isFloat(string s)
{
bool result = true;
bool decimalSeen = false;
for(int i = 0; i < s.length(); ++i)
{
if(s[i] == '.')
{
if(!decimalSeen)
{
decimalSeen = true;
}
else
{
result = false;
break;
}
}
else if(s[i] >= '0' && s[i] <= '9')
{
continue;
}
else
{
result = false;
break;
}

}
return result;
}

int main()
{
ifstream File("t.txt");
string line;

if(!File.is_open())
{
cerr << "Cannot open file." << endl;
return -1;
}
else
{
while(getline(File, line))
{
if(isFloat(line))
{
float val = atof(line.c_str());
// Now add to array
}
}
}

system("pause");
return 0;
}

Если вы хотите использовать массив, вам нужно будет создать новый больший массив и скопировать значения. Главная идея:

int maxSize = 10;
float* a = new float[maxSize];
// use a until it is full then
float* b = new float[maxSize*2];
memcpy(b, a, sizeof(float)*maxSize);
maxSize *= 2;
float* temp = a;
// make a point to new array
a = b;
// free memory a was using before
delete[] temp;
0

По вопросам рекламы [email protected]