Passing non integer input through console - c++

I have this code :
int obj;
while ( std::cin >> obj )
{
std::cout << obj << std::endl ;
int temp = obj ;
++ temp;
std::cout << temp << std::endl ;
}
When I give proper integer inputs, I understand the output.
eg. If I get 12 as input, I see something like this on console :
12
12
13
But, if I give some integers with white spaces as input, I can't seem to understand the output.
eg. If I give 12 12 12 12 as input, I see this on console :
12 12 12 12
12
13
12
13
12
13
12
13
Can someone please explain ?

The first example includes your input.
input
12
output
12
13
The second example is exactly this, multiplied 4 times, for each of the 4 numbers received as input. The seperator is "whitespace" - spaces, new lines or tabs. It is not a "non integer", but rather "four integers":
The input:
12 12 12 12
is equivalent to
12
12
12
12
output:
12
13
12
13
12
13
12
13

The loop reads whatever the input is, only after you hit "enter". So in the first case, it reads one value 12, prints 12 then 13 for the updated value in temp, then goes back waiting for you to type more numbers.
In the second case, it reads 12, prints 12 & 13, then goes back, reads another 12, prints 12 & 13, and so on another 2 times. Then goes back waiting for your to type more data.
Note that whitespace is a proper separator for your input. If you want it to go wrong, try typing 12a, in which case it will print 12 & 13 forever (well, until you get bored and stop it), since it will "stop reading" at the 'a' without updating obj - and because nothing in the loop clears out the a, it keeps going.

When you add the space, it takes them as separate values. And run the while loop for each of them.

int obj;
cin >> obj;
cin reads valid integer data from your input until it finds a character that does not belong to an integer, or there is no more data. In your first example, cin hits the end of your input and returns the number. In your second example, cin reads the input from the string "12 12 12 12", extracts the first integer from your input stream and writes it to obj. In the next run of your while loop, cin is confronted with the string "12 12 12" (since it has extracted/removed the first number from your input stream) and the story continues until there is no more input to read from.

Related

Is there a way to set a specific amount of maximum spaces for TAB character (backslash t) "\t" in C++?

I want to print a square matrix that needs to be spaced each between the elements by 3 spaces. Then I found that char '\t' might be the easiest way. But, I think the number of spaces is somehow defined in certain algorithm. Could someone give me a guide through the algorithm or is there a way to set certain spaces in C++ for '\t'?
I know how to output manually by determining the number of space character. However '\t' seems simple to code rather than looping certain algorithm.
For a simple square matrix :
for (int x = 0, num = 1; x < 5; x++) {
for (int y = 0; y < 5; y++, num++) {
cout << num << "\t";
}
cout << endl;
}
The code outputs
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
while I need
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
Is there a way to set '\t'?
But, I think the number of spaces is somehow defined in certain algorithm.
...
Is there a way to set '\t'?
Not unless your connected terminal allows you to control that in a way.
The usual way to control output formatting using I/O manipulators, for your case
std::setw()
std::left (or may be better std::right for numbers)
I'm pretty sure the size of a tab is defined by your console, so this will be a setting of your IDE.
If you want a consistent quantity of spaces, you're better off using spaces. That way you don't have to alter the console settings of everything you run your code on. Why not just do something like
" "
instead of "\t" ?
EDIT: Apparently Stack overflow doesn't appreciate multiple spaces in-text.

Blank Screen while inputting from file c++

So i am working on my project and i am facing a problem. Every time i try to input data from file in c++ i got blank screen
The code :
int main() {
string make[1000],model[1000],partName[1000];
int partNo[1000],quantity[1000];
double price[1000];
int i = 0;
ifstream myFile("file.txt");
while (!myFile.eof())
{
myFile >> make[i] >>model[i]>> partNo[i] >>quantity[i]>> price[i]>>partName[i];
i++;
}
for (int j = 0;j < i;j++)
cout << make[j] <<"\t"<<model[j]<<"\t"<< partNo[j] <<"\t"<<quantity[j]<<"\t"<< price[j]<<"\t"<<partName[j]<<endl;
return 0;
}
a sample from data file :
Pajero NA1H25 1 26 3.65 BLADE W/S WIPER
Pajero NA1S25 2 12 65.7 OIL SEAL-T/M CASE
Pajero NA3H25 3 20 14.6 OIL SEAL-DIST
Pajero NA3H25 4 26 10.95 DISC-CLUTCH
Pajero NC3V25 5 13 14.6 FUSIBLE LINK
Pajero ND0000 6 12 3.65 WEATHERSHIELD PKGE-L
Pajero ND1V45 7 10 32.85 SEAL & BOOT KIT
Pajero ND1Z45 8 24 62.05 FUSIBLE LINK
Pajero ND1Z45 9 9 18.25 COVER-HANDLE LH
Pajero ND1Z45 10 6 3.65 PIPE ASSY-OIL
anyone can help ??
Input with operator >> to a std::string will only read a single word.
This means that the first input will read "BLADE" and leave "W/S WIPER" in the input buffer, and the next read will start from there. Eventually, an input operation for a numeric field will try to read letters, and fail to read.
After that the stream is in a bad condition and nothing else is read, even though myfile.eof() is not true (but myfile.fail() is). There you have an infinite loop. See Why is iostream::eof inside a loop condition considered wrong?

Remove parts of text file C++

I have a text file called copynumbers.txt that I need to delete some numbers after a number while using Example would be a text file containing the following
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
each integer should occupy 4 byte spaces.
I want to delete or get rid of number 7 to 15 while keeping 1 through 6 then adding the number 30 to it.
so then the file would keep 1 to 6 and get rid of 7 to 15 then after that I want to at 30 at the end of it.
my new file should look like this
1 2 3 4 5 6 30
my question is how would I do that without overriding the number 1 to 6?
because when I use
std::ofstream outfile;
outfile.open ("copynumbers.txt");
it will override everything and leave only 30 in the file
and when I use
ofstream outfile("copynumbers.txt", ios::app);
It will just append 30 after 15 but does not delete anything.
Some of my code:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ofstream outfile("copynumbers.txt", ios::app);
outfile.seekp(0, outfile.end);
int position = outfile.tellp();
cout << position;
//outfile.seekp(position - 35);
outfile.seekp(28);
outfile.write(" 30",4);
outfile.close();
return 0;
}
It's generally a bad idea to try to modify a file "in place" - if anything goes wrong then you end up with a corrupted or lost file. Typically you would do something like this:
open original file for input
create temporary file for output
read input file, process, write to temporary file
if successful then:
delete original file
rename temporary file to original file name
As well as being a safer strategy, this makes the process of modifying the contents easier, e.g. to "delete" something from the file you just skip over that part when reading the input (i.e. just don't write that part to the output file).
You have to use seekp function. Check this out.
http://www.cplusplus.com/reference/ostream/ostream/seekp/
I would recommend read the original file in memory,make the required changes in memory and then write everything out to the file from scratch.
Would a std::istream_iterator help you here?
If you know you just want the first 6 words you can do something like this:
std::istringstream input( " 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15" );
std::vector< int > output( 7, 30 ); // initialize everything to 30
std::copy_n( std::istream_iterator< int >( input ), 6, output.begin() ); // Overwrite the first 6 characters
If you wanted your output tab separated you could do something like this for output:
std::ofstream outfile( "copynumbers.txt" );
outfile << '\t';
std::copy( outfile.begin(), outfile.end(), std::ostream_iterator< int >( outfile, "\t" ) );

Reading in an unknown number of integers separated by spaces into one vector per line

Each line of my file consists of an unknown number of integers, which are separated by spaces. I would like to read in each line as a vector of those integers.
Here is an example of such file:
11 3 0 1
4 5 0 3
2 3 4 1
23 4 25 15 11
0 2 6 7 10
5 6 2
1
11
I've been able to read in small amounts of data successfully using the following method (Note that outer_layers is a vector that contains these vectors I'm trying to populate):
for (int i = 0; i < outer_layers.size(); i++)
{
while (in >> temp_num)
{
outer_layers[i].inner_layer.push_back(temp_num);
if (in.peek() == '\n')
break;
}
}
However, when I'm trying to read in larger amounts of data, sometimes it'll read in two lines under one vector. In one of the files, out of 24 lines, it read two-liners on two occasions, so last two vectors did not have any data.
I can't wrap my head around it. Any ideas what I'm doing wrong?
EDIT: Something interesting I've noticed in some of the lines of the trouble-maker file is this:
Let's say there are three lines.
23 42 1 5
1 0 5 10
2 3 11
Line #1 reads in just fine as 23 42 1 5; however, line #2 and #3 get read together as 1 0 5 10 2 3 11.
In Notepad++ they look just fine, each on their own lines. However, in Notepad, they look like this:
23 42 1 51 0 5 10 2 3 11
If you notice, the 5 (last integer of line #1) and 1 (first integer of line #2) are not separated by spaces; however, 10 and 2 are separated by a space.
I've noticed that behavior on any double-read-in lines. If they are separated by a space, then they're both read in. Not sure why this is occurring, considering there should still be a new line character in there for Notepad++ to display the on separate lines, am I right?
I'm not sure how your outer_layers and inner_layers is setup, but you can use std::getline and std::stringstream to fill your vectors something like this :
std::vector< std::vector<int> > V ;
std::vector <int> vec;
std::ifstream fin("input.txt");
std::string line;
int i;
while (std::getline( fin, line) ) //Read a line
{
std::stringstream ss(line);
while(ss >> i) //Extract integers from line
vec.push_back(i);
V.push_back(vec);
vec.clear();
}
fin.close();
for(const auto &x:V)
{
for(const auto &y:x)
std::cout<<y<<" ";
std::cout<<std::endl;
}

C++ input data into a struct variables from data file

I have a text file containing names and numbers. The name or the string contains 15 chars and I need to put it to the string. I'm working with structures.
struct grybautojas{
string vardas;
int barav, raudon, lep, diena;
}gryb[100];
After that, there are simple calculations which is done right, the problem is, it only reads everything once. After taking a first "box" of information, it just stops. Everything else in the result file is either blank as a string or 0 as an integer.
Here's my input function:
void ivedimas(){
char eil[16];
int b,r,l;
inFile >> n;
inFile.ignore();
for(int i=0;i<n;i++){
inFile.get(eil,15);
gryb[i].vardas=eil;
inFile >> gryb[i].diena;
gryb[i].barav=0, gryb[i].raudon=0, gryb[i].lep=0;
for(int m=0;m<gryb[i].diena;m++){
inFile >> b >> r >> l;
gryb[i].barav+=b, gryb[i].raudon+=r, gryb[i].lep+=l;
}
inFile.ignore();
}
inFile.close();
}
And here's the file containing data:
4
Petras 3
5 13 8
4 0 5
16 1 0
Algis 1
9 6 13
Jurgis 4
4 14 2
4 4 15
16 15 251
1 2 3
Rita 2
6 65 4
4 4 13
What's the problem?
inFile.get(eil,15);
Rita 2
Petras 3
00000000011111
12345678901234
I don't count 15, I count 14. Also, some of your lines seem to have a space at the end. You should rewrite your input logic to be much more robust. Read lines and parse them.
This line:
inFile.get(eil,15);
is reading the number that follows the name.
When you try to read the number (3 in your example), you get the next one (5) instead.