извлечь числа из текста в C ++ - ошибка сегментации

0

У меня есть текст, содержащий номера: 148,147,148,146,135,22,.... с почти 11000 номерами. Я хочу поместить каждое нечетное число -positioned (первое, третье...) в массив (148,148,135...) и каждый номер -positioned в другой (второй, четвертый..., то есть 147 146, 22...). Запустив следующий фрагмент кода, я получаю ошибку с ошибкой сегментации, и я не уверен, что числа правильно попадают в массивы. Вы можете помочь?

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


 int main(){
 ifstream infile;
 int arraya[11000];
 int arrayb[11000];
 int i=0;
 int noum=0;
 char cNum[10];
            infile.open ("pairs.txt", ifstream::in);

            if (infile.is_open())
            {

                    while (infile.good())
                    {
                        infile.getline(cNum, 256, ',');
                        if ( i % 2== 0 )
                        arraya[i]= atoi(cNum); 
                        else
                        arrayb[i]= atoi(cNum) ;                 
                        i++ ;
                    }
                    infile.close();
            }
            else
            {
                    cout << "Error opening file";
            }

 for (i=0; i<10;i++){
 cout<<arraya[i];
 cout<<",";
 cout<<arrayb[i];}
 return 0;
}
  • 0
    Не ответ, но .. Вы объявляете int arraya [6000]; И вы делаете arraya [i] = atoi (cNum); Без тестирования, если я <6000 Плохая практика.
  • 0
    Разместите образец ввода.
Показать ещё 1 комментарий
Теги:
text

3 ответа

0

Вам нужно иметь логическую переменную, объявляющую, если число четное или нечетное, оно также разрешено итератором и проверяет, является ли это% 2 == 0, это всего лишь одно из приложений:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
using namespace std;

int main()
{
    ifstream text;
    text.open("yourfile", ifstream::in);

    if (!text.is_open()) {
        cerr << "Error opening file.";
        return 1;
    }

    int arrayA[1000];
    int arrayB[1000];
    int iA = 0;
    int noum = 0;
    int iB = 0;
    bool odd = true;
    string cNum;
    while(text >> cNum) {
        noum = atoi(cNum.c_str());
        if (!odd) {
            arrayA[iA++] = noum;
            odd = true;
        } else {
            arrayB[iB++] = noum;
            odd = false;
        }
    }
    text.close();
    if (!odd)
        for (int i = 0; i < iA; i++)
            cout << arrayA[i] << ", " << arrayB[i] << endl;
    else
        for (int i = 0; i < iB; i++)
            cout << arrayA[i] << ", " << arrayB[i] << endl;
    return 0;
}
0

изменять

while (infile.good())
{
    infile.getline(cNum, 256, ',');

в

while (infile.getline(cNum, 10, ',')) {

так как размер cNum составляет всего 10.

Кроме того, как упоминал @synapse, вы пишете границы массива. Тебе нужно

if ( noum % 2== 0 )
    arraya[i/2]= atoi(cNum); 
else
    arrayb[i/2]= atoi(cNum);                 
0
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
    ifstream infile;
    int arraya[6000];
    int arrayb[6000];
    int iA = 0;
    int iB = 0;

    int noum = 0;
    char cNum[10];
    infile.open("pairs.txt", ifstream::in);

    if (infile.is_open()) {

        while (infile.getline(cNum, 256, ',')) {

            noum = atoi(cNum);
            if (noum % 2 == 0)
                arraya[iA++] = noum;
            else
                arrayb[iB++] = noum;
        }

        infile.close();
    } else {
        cout << "Error opening file";
    }
    cout << "Even: " << endl;
    for (int i = 0; i < iA; i++) {
        cout << arraya[i];
        cout << ",";
    }

    cout << std::endl;

    cout << "Odd: " << endl;
    for (int i = 0; i < iB; i++) {
        cout << arrayb[i];
        cout << ",";
    }

    return 0;
}
  • 0
    спасибо @ Уэсли. мечеть!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню