[try Beta version]
Not logged in

 
Read last line text file

Pages: 12
Aug 21, 2013 at 6:03pm
I'm still learning and did not understand how to declare it
Aug 21, 2013 at 6:06pm
Well, what type is it supposed to be?
Last edited on Aug 21, 2013 at 6:07pm
Aug 21, 2013 at 6:09pm
I'm confused .. I have stated the type of variable, some missing include?
Aug 21, 2013 at 6:13pm
Presumably Wake is referring to http://msdn.microsoft.com/en-us/library/system.convert.todouble.aspx

Which is not C++.
Aug 21, 2013 at 6:24pm
exact ... My mistake, I thought something like that in other forums and tried ...

How can I convert the string to float?
Aug 21, 2013 at 6:34pm
If your compiler has C++11 support, you can use std::stof (or std::stod for double).

http://en.cppreference.com/w/cpp/string/basic_string/stof

If not, writing your own version isn't terribly hard:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
#include <sstream>
 
float to_float(const std::string& str)
{
   std::istringstream is(str) ;
   float result ;
   
   is >> result ;
   return result ;
}
 
int main()
{
    std::string input ;
    std::cout << "Enter a number\n" ;
    std::cin >> input ;
 
    float value = to_float(input) ;
    std::cout << "value is " << value << '\n' ;
}


http://ideone.com/oXBOBM

[edit: It would've been better to start a new topic for questions unrelated to the original.]
Last edited on Aug 21, 2013 at 6:36pm
Aug 23, 2013 at 5:27am
hehe float to_float(const std::string& str) looks funny.
Aug 23, 2013 at 6:02am
What makes it funny?

For simplicity, it lacks error handling. The std::stof throws exceptions when input is not acceptable. There are other ways too. There are two important things to do: (1) to learn to handle invalid input, and (2) to choose the general policy on what to do on error.
Aug 23, 2013 at 6:28am
It kind of looks like "change a float to float" that is all. You can use a stringstream too.
Aug 23, 2013 at 9:17am
It just makes your code cleaner doesn't it.
Aug 23, 2013 at 10:28am
Superdude wrote:
You can use a stringstream too.

to_float does exactly that; there is no "too".

C++11 can declare auto to_float( const std::string& str ) -> float; that could look more intuitive (but is mainly for the compiler, which has no psychic abilities at all).
Last edited on Aug 23, 2013 at 10:28am
Aug 23, 2013 at 11:16am
Good Day, I would like to take a doubt
In this code I get the last line of the file, as it would be to catch the penultimate line?

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <fstream>
#include <limits>
#include <string>

std::istream& ignoreline(std::ifstream& in, std::ifstream::pos_type& pos)
{
    pos = in.tellg();
    return in.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

std::string getLastLine(std::ifstream& in)
{
    std::ifstream::pos_type pos = in.tellg();

    std::ifstream::pos_type lastPos;
    while (in >> std::ws && ignoreline(in, lastPos))
        pos = lastPos;

    in.clear();
    in.seekg(pos);

    std::string line;
    std::getline(in, line);
    return line;
}

int main()
{
    std::ifstream file("temp.txt");

    if (file)
    {
        std::string line = getLastLine(file);
        std::cout << line << '\n';
    }
    else
        std::cout << "Unable to open file.\n";
}
Aug 23, 2013 at 2:39pm
Sorry, I forgot. I thought he was using the strof function. penultimate???
Aug 23, 2013 at 5:00pm
currently the script gets the last line, I get the previous line of the last
Aug 23, 2013 at 5:04pm
The line right before the last?
Aug 23, 2013 at 5:24pm
Text files are goofy things. I actually had an argument before with people about the number of lines in a text file.

I count newlines as separators, introducing a new line.
But some people (even some more modern systems) count them as line terminators. (Which is why your text files should always terminate with a newline.)

So you have to consider that the last line may be an empty line. If it is, discard it -- don't count it as one of your lines.

    "1\n2\n3\n" --> the 'last line' is "3", not "".

    "1\n2\n3" --> the last line is "3".

Hope this helps.
Aug 24, 2013 at 2:03am
Wake wrote:
currently the script gets the last line, I get the previous line of the last

I showed you how to get the last line. I'm sure you can modify the code to make it work for the next-to-last if you really wanted to, although the next step would be to make it work for arbitrary lines in the file, and just reading in all the lines for that and retrieving them from a container would probably be preferred.


Duoas wrote:
So you have to consider that the last line may be an empty line.

The posted code ignores all empty lines (in >> std::ws prior to ignoreline.) So, I suppose it doesn't actually retrieve the last line in the file in some cases. Maybe getLastNonEmptyLine would be a better name for the function.
Aug 24, 2013 at 2:17am
If anyone is interested, the tail utility's source is an, er... interesting read.
http://www.gnu.org/software/coreutils/
Aug 24, 2013 at 2:32am
closed account (N36fSL3A)
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
26
27
28
#include <iostream>
#include <fstream>
#include <string>

#include <vector>

using namespace std;

int main()
{
	fstream file("example.txt");
	vector<string> contents;
	string buffer;
	
	if(file)
	{
		while(getline(file, buffer))
		{
			contents.push_back(buffer);
		}
		
		cout << contents[contents.size() - 1] << "\n";
	}
	
	std::cin.get();

	return 0;
}


Something like this. I didn't compile it at all, but I use this basic model in my program and I read everything in a file. There could be more error handling.

This isn't the most efficient way, but it gets the job done. You could empty the vector if you want it a bit more conservative of memory.

/*your guy's ways are kinda lengthy*/
Last edited on Aug 24, 2013 at 2:36am
Topic archived. No new replies allowed.
Pages: 12