2014-03-14 3 views
0

Я новичок в C++ и ive. Я пытаюсь обернуть голову вокруг этого всего дня. Я пытаюсь прочитать файл данных, который содержит неизвестное количество строк (хотя учитель сказал, что не будет более 100 строк). Каждая строка содержит 4 целых числа, значения которых находятся в диапазоне от 0 до 100. В течение семестра 4 столбца представляют результаты тестов учащихся. Каждая строка/строка представляет оценки одного учащегося. в то время как каждый столбец представляет собой 1 тест. Я должен создать 2D-массив, чтобы прочитать оценки. Оценки из файла данных поступают в первые 4 столбца и в среднем по всем 4 тестам, рассчитанным в столбце 5 для каждого ученика/строки. Я буду иметь строки от 0 до n-1 из-за того, что я не знаю, сколько учеников/строк находится в файле. В n-й строке я вычисляю каждую строку позиции [0-4] как среднее значение всего столбца над ней. Средний класс всех учащихся, рассчитанных в нижней части каждой строки столбца (n-й), и каждый ученик средний для всех четырех тестов, рассчитанных в столбце 5. Среднее среднее значение для каждого ученика, рассчитанное в нижней части столбца 5 (оценки [n-я строка] [5] = {в среднем по всем строкам в столбце 5}копирование фактических значений массива 2d в другой 2d-массив C++

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

Это была моя первая попытка:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <iomanip> 
#include <sstream> 
#include <cmath> 
#include <vector> 

using namespace std; 
double grades [100][5] = {0}; 
int row = 0; 
int column = 0; 

int main() { 
char line[100]; 
ifstream myfile("sturec.dat"); 

if(myfile){ 
    while (getline(myfile, line)) { 
     if (line == char) { 
      //grades[row][column] = 
      cout << line << endl; 
      for (int i = 0; i <= line.length(); i++) { 
       if (line[i] != line[0]) && (i == " ") && (line[i+1] == char) { 
        column += 1; 
       } 
       else if (line[i] && line[i+1] && line[i+2] !== " ") { 
        grades[row][column] = {line[i] + line[i+1] + line[i+2]}; 
       else if (line[i] && line[i+1] !== " ") { 
        grades [row][1] = {line[i] + line[i+1]}; 
       } 


      } 
      row += 1; 
     } 
    } 
} 

} , который я сдался и начал с попытки создать вектор векторов для заполнения файлом. Мне потребовалось много времени, чтобы понять, как фактически вывести данные из файла. Наконец я прибег к:

#include //all the necessary libraries 
using namespace std; 
double grades[100][5] = {0}//the 2d array i had hoped to populate with the data from file 

int main(){ 
ifstream myfile("filename"); 
rowCount = 0; 
int t1, t2, t3, t4; 
while(myfile >> t1 >> t2 >> t3 >> t4){ 
    cout << t1 << " " << t2 << " " << t3 << " " << t4 << endl; 
      cout << "this is row 1 + : " << rowCount << endl; 
//at this point i was just happy to have successfully read the file and printed the values. 

      rowCount ++; 
} 
for(int i = 0; i < 4; i++){ 
    grades[rowCount][i]// this is where i got lost i tried multiple different things in attempt to populate "grades" by trying to create temp arrays to hold the values of t1,2,3,4 in order to parse them and place them in "grades", but to no avail. Any direction would be appreciated. 
} 

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

``

#include <iostream> 
#include <fstream> 
#include <vector> 
#include <string> 

using namespace std; 
double grades[100][5] = {0}; 

int main() { 
    ifstream myfile("sturec.dat"); 
    int rowCount = 0; 
    int tempArray[100][4] = {0}; 
    char test [4] = {0}; 
    int i = 0;  
     while (myfile >> tempArray[rowCount][i]) { 
      cout << rowCount << endl << " " << i << endl; 
      cout << "temp array: " << tempArray<< endl; 
      while(i < 4){ 
       i++; 
       rowCount++; 
      } 
     } 
     /*for (int c = 0; c <= rowCount; c++) { 
      for (int r = 0; r <= i; r++) { 
       grades[rowCount][i] = (tempArray[r][c]); 
      } 
     } 
    cout<< tempArray << endl << grades << endl; 
    */ 
} 
    /*double final; 
    while (myfile >> grades[rowCount][test]) { 
     //cout << t1 << " " << t2 << " " << t3 << " " << t4 << endl; 
     cout << grades << endl; 
     cout << rowCount << endl; 
       //cout << grades[rowCount][] 
     rowCount ++; 
    } 


} 
    */ 

Следующая

#include <iostream> 
#include <fstream> 
#include <vector> 
#include <string> 

using namespace std; 
double grades[100][5] = {0}; 

int main() { 
ifstream myfile("sturec.dat"); 
int rowCount = 0; 
int tempArray[100] = {0}; 
int t1, t2, t3, t4; 
while (myfile >> t1 >> t2 >> t3 >> t4) { 
    cout << t1 << " " << t2 << " " << t3 << " " << t4 << endl; 
    int test [4] = {0}; 
    for (int i = 0; (i < sizeof(test) - 1); i++) { 
      grades[rowCount][i] = {tempArray}; 
    } 
} 
double final; 
while (myfile >> grades[rowCount][i]) { 

    cout << grades << endl; 
    cout << rowCount << endl; 
      //cout << grades[rowCount][] 
    rowCount ++; 
} 



vector < vector <int> > grades(100); 
//vector <int> rows(4/*,0*/); // assigns 4 columns to rows vector with value of zero 
//rows.assign(5,0); 
int row = 0; 

myfile.open("sturec.dat", ios::in); //opens file 
if (myfile.is_open()) { 

    cout << "file opened" << endl; 

    string line; 
    vector<string> myLines; 
    while (getline(myfile, line)) { //gets lines using myfile and puts them in line 
     myLines.push_back(line); 

     cout << "string line contains: " << line << endl; 
     for (int columns = 0; columns <= 4 /*sizeof(rows)*/; columns ++) { 
      myfile >> grades[row][columns];   cout << "2" << endl; 

     } 
     row += 1; 
    } 
} 

else cout << "cannot open file" << endl; 
myfile.close(); cout << "closed file" << endl; 
return 0; 

//cout << grades; 

}

последнее:

#include <iostream> 
#include <fstream> 
#include <vector> 
#include <string> 

using namespace std; 

int main() { 
ifstream myfile; 
vector < vector <int> > grades(100); 
//vector <int> rows(4/*,0*/); // assigns 4 columns to rows vector with value of zero 
//rows.assign(5,0); 
int row = 0; 

myfile.open("sturec.dat", ios::in); //opens file 
if (myfile.is_open()) { 
    cout << "1" << endl; 
    cout << "file opened" << endl; 

    string line; 
    vector<string> myLines; 
    while (getline(myfile, line)) { //gets lines using myfile and puts them in line 
     myLines.push_back(line); 

     cout << "string line contains: " << line << endl; 
     for (int columns = 0; columns <= 4 /*sizeof(rows)*/; columns ++) { 
      myfile >> grades[row][columns];   cout << "2" << endl; 

     } 
     row += 1; 
    } 
} 

else cout << "cannot open file" << endl; 
myfile.close(); cout << "closed file" << endl; 
return 0; 

//cout << grades; 

} Это одна на самом деле получил мне первую строку файла но я не смог получить эту ошибку, чтобы уйти: Выполнить команду: линии 1: неисправность 13531 Сегментация: 11 ./"$2" "$ {@: 3}"

+1

вектора <вектора > классов (100, вектор (5,0)); – camino

+1

C++ - это не язык, хорошо подходящий для синтаксиса проб и ошибок. –

+0

«// Это где я потерялся» - похоже, что вы просто хотели «оценки [rowcount] [0] = t1; оценки [rowcount] [1] = t2; оценки [rowcount] [2] = t3; классы [rowcount] [3] = t4; ', а также помещать этот код внутри цикла while, а не после него, и увеличивать' rowcount'. –

ответ

0
vector < vector <int> > grades(100); 

инициализирует вектор, содержащий 100 vector<int> х размер 0.Для того, чтобы избежать ошибок сегментации в вашем последнем примере, вы должны либо инициализировать это как

vector < vector <int> > grades(100,vector<int>(5,0)); 

или заменить myfile >> grades[row][columns]; с чем-то вроде

int tmp; 
myfile >> tmp; 
grades[row].push_back(tmp); 
+0

я вижу. Спасибо! – user3414683

Смежные вопросы