заполнение 2D-массива фиктивными данными и txt-файлом формы ввода не работает

#c

#c

Вопрос:

привет, итак, мне нужно заполнить 2D-массив фиктивных значений, таких как x, значениями из txt-файла, «x» используется для заполнения пустых столбцов, если file.txt имеет мало данных или вообще не имеет их . file.txt выглядит примерно так

 1 23 3 42 5 63 4 . 5
-2 1 43 95 55 5 43 2 -6
. 2 3 -4 5 43 -4 4 35
82 61 3 5 -5 65 . 2 6

 

мой c выглядит так

 #include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

int main(){
    ifstream file;
    ofstream newfile;
    string filename;
    string text;
    const int n = 10;
    char x = 'x';
    double A[n][n];


    for (int i = 0; i < n; i  ){
        for (int j = 0; j < n; j  ){
            A[i][j] = x;
            cout << A[i][j];
        }
    }
    


    do{
        cout << "Podaj nazwe pliku(wraz z rozszerzeniem): ";
        cin >> filename;
        file.open(filename.c_str());
    }while (!file.is_open());

    for (int i = 0; i < n; i  ){
        for (int j = 0; j < n; j  ){
            if (!file.eof()){
                getline(file, text);
                A[i][j] = stod(text, 0);
                
                
            }else{
                break;
            }
        }
    }
    file.close();

    for (int i = 0; i < n; i  ){
        for (int j = 0; j < n; j  ){
           cout << A[i][j]; 
        }
        cout << endl;
    }
}

 

когда я распечатываю этот массив, я получаю вывод, подобный 127.77098e-3184. я не могу скопировать свой ввод, потому что он не печатается прямо сейчас, я не знаю почему

Комментарии:

1. char x = 'x'; double A[n][n]; A[i][j] = x; — Почему вы присваиваете char переменную массиву , который tales double ?

2. Ваш код даже не доходит до последнего цикла, он запускается std::invalid_argument what(): stod раньше. Задумывались ли вы о том, как вы форматируете свои числа и как вы их читаете?

Ответ №1:

Проблема:

  1. Когда вы используете std::getline , вы берете всю строку вместо того, чтобы брать одно число.
  2. "." не является допустимым аргументом для std::stod so, поэтому он выдаст std::invalid_argument исключение.

Решение:

  1. std::ifstream::operator>> Вместо этого используйте.
  2. Переформатируйте файл и измените "." значение, которое он должен представлять (я предполагаю, что это 0). Даже семантически точка сама по себе не представляет число.

Дополнительная информация:

  1. using namespace std; считается плохой практикой.
  2. newFile Переменная не используется.
  3. x Переменная должна быть двойной.
  4. <cmath> Заголовок не используется.
  5. Вы можете использовать std::array .

Полный код:

file.txt

 1 23 3 42 5 63 4 0 5
-2 1 43 95 55 5 43 2 -6
0 2 3 -4 5 43 -4 4 35
82 61 3 5 -5 65 0 2 6
 

main.cpp

 #include <iostream>
#include <fstream>

int main(){
    std::string filename;
    std::string text;
    constexpr int n = 10;
    double x = -1;
    double A[n][n];

    for (int i = 0; i < n; i  ){
        for (int j = 0; j < n; j  ){
            A[i][j] = x;
            std::cout << A[i][j] << " ";
        }
        std::cout << std::endl;
    }

    std::ifstream file;
    do{
        std::cout << "Podaj nazwe pliku(wraz z rozszerzeniem): "; //Insert filename.
        std::cin >> filename;
        std::cout << std::endl;
        file.open(filename);
    }while (!file.is_open());

    for (int i = 0; i < n; i  ){
        for (int j = 0; j < n; j  ){
            if(file >> text){
                A[i][j] = std::stod(text, 0);
            }
            else{
                break;
            }
        }
    }
    file.close();

    for (int i = 0; i < n; i  ){
        for (int j = 0; j < n; j  ){
           std::cout << A[i][j] << " ";
        }
        std::cout << std::endl;
    }
}