0

101 175 123 52 78 184 202 8 219 15 49 254 86 62

156 213 41 200 123 131 252 186 108 116 39 205 243 120

218 239 201 109 52 173 244 58 185 18 64 209 165 222

81 136 247 149 183 206 164 214 179 121 176 200 89 128

I am reading a numbers text file into a dynamically allocated integer array. I am not sure how to detect newline while reading numbers into int data type "while(num!='\n')" This is what I have tried ao far. Although I know we can't read characters into int data type variable but I ain't sure how to tackle this problem

#include<iostream>
#include<fstream>
using namespace std;
int  main()
{
   int num=0; 
   int size=0;
   int* ptr=nullptr;
   ifstream fin;
   fin.open("numbers.txt");
   while(fin>>num)
   {
      while(num!='\n')
      {
         int* nptr=new int[size+1];
         for(int i=0; i<size; i++)
         {
            nptr[i]=ptr[i];
         }

         nptr[size++]=num;
         ptr=nptr;
         delete[] nptr;
         nptr=nullptr;
         fin>>num;
      }


   }
   for(int i=0; i<size; i++)
   {
      cout<<ptr[i]<<endl;
   }
}
Pierre François
  • 5,850
  • 1
  • 17
  • 38
  • This will not work, because `operator>>` will not load characted `\n` into variable of type `int`. Take a look at [this answer](https://stackoverflow.com/questions/7868936/read-file-line-by-line-using-ifstream-in-c) and try reading the file line by line. After that you can split the string (with white space as delimiter) – pptaszni Jan 16 '20 at 10:05

1 Answers1

0

A common approach is to read the file line-by-line, then use istringstream to parse a single line.

Also as you are using C++, std::vector would be much more suitable for this purpose than the error-prone pointer to pointer.

A sample looks like this:

ifstream fin;
fin.open("numbers.txt");

std::string line;
std::vector<std::vector<int>> mat; // use vector of vector instead of pointer to pointer
while (std::getline(fin, line))    // read line-by-line
{
    cout << line << "\n";

    std::istringstream iss(line);  // then process each line separately
    int x;
    std::vector<int> row;
    while (iss >> x)
    {
        cout << x << '\t';
        row.push_back(x);
    }
    mat.push_back(row);
    cout << '\n';
}


// Check the output content
for( const auto &row : mat )
{
    for( const auto &x : row )
    {
        cout << x << '\t';
    }
    cout << '\n';
}
acraig5075
  • 10,588
  • 3
  • 31
  • 50
artm
  • 17,291
  • 6
  • 38
  • 54