new >> Как мне прочитать файл, который имеет 3 столбца, и каждый столбец содержит 100 чисел в массив? - PullRequest
4 голосов
/ 25 апреля 2010
int exam1[100];// array that can hold 100 numbers for 1st column 
int exam2[100];// array that can hold 100 numbers for 2nd column 
int exam3[100];// array that can hold 100 numbers for 3rd column  

int main() 
{ 
  ifstream infile;   

  int num; 
  infile.open("example.txt");// file containing numbers in 3 columns 
     if(infile.fail()) // checks to see if file opended 
    { 
      cout << "error" << endl; 
    } 
       while(!infile.eof()) // reads file to end of line 
      { 
         for(i=0;i<100;i++); // array numbers less than 100 
           { 
        while(infile >> [exam]); // while reading get 1st array or element 
            ???// how will i go read the next number 
            infile >> num; 
          } 
      } 
  infile.close(); 
} 

Ответы [ 2 ]

3 голосов
/ 25 апреля 2010

Правило № 1 о чтении данных из файла: не доверяйте содержимому файла. Вы никогда не будете знать с абсолютной уверенностью, что находится в файле, пока не прочитаете его

Тем не менее, один правильный способ чтения строк данных из файла, где каждая строка состоит из нескольких полей, разделенных пробелами, заключается в использовании комбинации getline и stringstream:

std::string line;
while (std::getline(infile, line))
{
    std::stringstream ss(line);
    int a, b, c;
    if (ss >> a >> b >> c)
    {
        // Add a, b, and c to their respective arrays
    }
}

На английском языке мы получаем каждую строку из потока файлов, используя getline, а затем анализируем строку на три целых числа, используя stringstream. Это позволяет нам быть уверенным, что каждая строка отформатирована правильно.

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

Существует другая обработка ошибок, которая может быть желательна:

  • В этом примере, если не удается извлечь целые числа из строки, мы просто игнорируем эту строку; было бы неплохо добавить логику, чтобы прервать процесс или сообщить об ошибке.
  • После того, как мы получим три целых числа, мы игнорируем оставшуюся часть строки; было бы неплохо добавить проверки, чтобы гарантировать, что в строке больше нет данных после требуемых целых чисел, в зависимости от того, насколько строгим должно быть форматирование файла.
  • После того, как мы закончим чтение файла, мы должны проверить, что eof() установлено, а не fail() или bad(); если установлен один из этих двух флагов, при чтении файла произошла ошибка.
3 голосов
/ 25 апреля 2010
int exam1[100];// array that can hold 100 numbers for 1st column 
int exam2[100];// array that can hold 100 numbers for 2nd column 
int exam3[100];// array that can hold 100 numbers for 3rd column  

int main() // int main NOT void main
{ 
  ifstream infile;   

  int num = 0; // num must start at 0
  infile.open("example.txt");// file containing numbers in 3 columns 
     if(infile.fail()) // checks to see if file opended 
    { 
      cout << "error" << endl; 
      return 1; // no point continuing if the file didn't open...
    } 
       while(!infile.eof()) // reads file to end of *file*, not line
      { 
         infile >> exam1[num]; // read first column number
         infile >> exam2[num]; // read second column number
         infile >> exam3[num]; // read third column number

         ++num; // go to the next number

         // you can also do it on the same line like this:
         // infile >> exam1[num] >> exam2[num] >> exam3[num]; ++num;
      } 
  infile.close(); 

  return 0; // everything went right.
} 

Я полагаю, у вас всегда есть 3 номера в строке. Если вы знаете точное количество строк, замените while на for от 0 до количества строк.

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