The Teej Posted August 5, 2008 Share Posted August 5, 2008 Hey all, when reading from a file using <fstream>, is there a way of jumping to a specific line in the file? If this is not possible, is it possible to do so using another file handling library? Link to comment Share on other sites More sharing options...
0 revvo Posted August 6, 2008 Share Posted August 6, 2008 You can use random access when reading files. To move the pointer from one point to another, you use the seek function Link to comment Share on other sites More sharing options...
0 The Teej Posted August 6, 2008 Author Share Posted August 6, 2008 You can use random access when reading files. To move the pointer from one point to another, you use the seek function Ok, thanks, I'll try this out tomorrow. Link to comment Share on other sites More sharing options...
0 Autumn 12 Posted August 7, 2008 Share Posted August 7, 2008 select the go menu option write the line number where you want go try this. i think this will help you...... Link to comment Share on other sites More sharing options...
0 ViZioN Posted August 7, 2008 Share Posted August 7, 2008 select the go menu option write the line number where you want go try this. i think this will help you...... I think he means reading from a file...not jumping to a line in his source code. Link to comment Share on other sites More sharing options...
0 Banjo Posted August 7, 2008 Share Posted August 7, 2008 There's no way to go to a specific line without reading up to that point, since each line in the file you are reading probably has a different length. You could try read the entire file while looking for newlines and for each newline you find, add the position to an array. Then you can seek to that position by using the line number as the array's index and the value as the position in the file. Link to comment Share on other sites More sharing options...
0 The Teej Posted August 7, 2008 Author Share Posted August 7, 2008 There's no way to go to a specific line without reading up to that point, since each line in the file you are reading probably has a different length. You could try read the entire file while looking for newlines and for each newline you find, add the position to an array. Then you can seek to that position by using the line number as the array's index and the value as the position in the file. That sounds incredibly taxing, though :/ Especially if it's a really big file that you need to go through multiple times. Or am I reading it wrong? Link to comment Share on other sites More sharing options...
0 Banjo Posted August 7, 2008 Share Posted August 7, 2008 You would only need to go through it once to store the line indexes in the array. After that, everything is fast since you just look up two values in the array - the start of the line you want and the start of the next line (so you know how much to read) If you are in control of what the file contains, an even easier method is to just pad each line to the same length and use multiplication to find out where the line starts Link to comment Share on other sites More sharing options...
0 HeartsOfWar Posted August 8, 2008 Share Posted August 8, 2008 seekg - http://www.cplusplus.com/reference/iostrea...ream/seekg.html Link to comment Share on other sites More sharing options...
0 Brandon Live Veteran Posted August 10, 2008 Veteran Share Posted August 10, 2008 That sounds incredibly taxing, though :/ Especially if it's a really big file that you need to go through multiple times. Or am I reading it wrong? Well how else would you do it? Unless the file has lines of a fixed length, or has its own index, somebody needs to scan through it to find the line breaks. Whether it's a library / API or your own code, it needs to be done. If you just need to scan to a certain line number once and make a single pass through the file, you don't need to save off the indices into an array as suggested. That's an optimization that you can do if you're going to need to seek to different lines within the file several times (and possibly out-of-order). Likely you'll want to make this part of your "loading" process for the file as users are accustomed to this behavior. Link to comment Share on other sites More sharing options...
0 HeartsOfWar Posted August 11, 2008 Share Posted August 11, 2008 by using the seekg method I posted earlier, the user can set the seekg to the 0th position from ios::end, access tellg to get the length of the file, then set seekg to the position he wanted knowing his upper and lower limits... very simple an efficient. Link to comment Share on other sites More sharing options...
0 chu121su12 Posted August 21, 2008 Share Posted August 21, 2008 (edited) how about using getline() ? Here you can find this code: ifstream fin("data.txt"); string s; while( getline(fin,s) ) { cout << "Read from file: " << s << endl; } which is reading string line by line. Just store the s.size(); (string's length) to a variable, and sum it up for each loop. You may set the loop limit as the argument pass, and return the sum for seekg();. If I got a chance, I'll put the code. Or maybe just use tellg(); after each loop for loop limit (line number). return the last tellg(); value for seekg(); This may not work. I just type it out here: long goto_file_line(int iLine_Number) { ifstream fin("data.txt"); string s; long length; fin.seekg (0, ios::beg); // go to the first line for (int i=0; i<=iLine_Number; i++) // loop 'till the desired line getline(fin, s); length = fin.tellg(); // tell the first position at the line, maybe +1 or -1. try if it's not working return length; } or add seekg(); for void, so you can continue your i/o after the function. void goto_file_line(int iLine_Number) { ifstream fin("data.txt"); string s; long length; fin.seekg (0, ios::beg); // go to the first line for (int i=0; i<=iLine_Number; i++) // loop 'till the desired line getline(fin, s); length = fin.tellg(); // tell the first position at the line, maybe +1 or -1. try if it's not working fin.seekg(length); } Edited August 21, 2008 by chu121su12 Link to comment Share on other sites More sharing options...
Question
The Teej
Hey all, when reading from a file using <fstream>, is there a way of jumping to a specific line in the file? If this is not possible, is it possible to do so using another file handling library?
Link to comment
Share on other sites
11 answers to this question
Recommended Posts