#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
переменную массиву , который talesdouble
?2. Ваш код даже не доходит до последнего цикла, он запускается
std::invalid_argument what(): stod
раньше. Задумывались ли вы о том, как вы форматируете свои числа и как вы их читаете?
Ответ №1:
Проблема:
- Когда вы используете
std::getline
, вы берете всю строку вместо того, чтобы брать одно число. "."
не является допустимым аргументом дляstd::stod
so, поэтому он выдастstd::invalid_argument
исключение.
Решение:
std::ifstream::operator>>
Вместо этого используйте.- Переформатируйте файл и измените
"."
значение, которое он должен представлять (я предполагаю, что это 0). Даже семантически точка сама по себе не представляет число.
Дополнительная информация:
using namespace std;
считается плохой практикой.newFile
Переменная не используется.x
Переменная должна быть двойной.<cmath>
Заголовок не используется.- Вы можете использовать
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;
}
}