• 0

[C++] How to jump a specific line when reading a file?


Question

11 answers to this question

Recommended Posts

  • 0

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.

  • 0
  Banjo said:
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?

  • 0

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

  • 0
  The Tjalian said:
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.

  • 0

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.

  • 0

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 by chu121su12
This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • >Fixed: Certain displays might be unexpectedly green. I believe that this fixed the Windows mishandling Dolby Vision issue in RGB 12 bit Full mode we saw recently.
    • These SSDs from Crucial, SanDisk, and Western Digital are selling at great prices by Fiza Ali Amazon US is currently offering a wide range of solid‑state drives at attractive prices, covering both internal and portable options to meet diverse storage needs. So, whether you're looking to expand your laptop's storage, speed up your desktop, or carry large files on the move, these discounts make it easier to secure reliable SSD technology without exceeding your budget. The 1TB Crucial BX500 is a 2.5‑inch SATA III solid‑state drive offering a maximum interface speed of 6Gb/s. In terms of performance, the drive achieves sequential read speeds of up to 540MB/s and sequential write speeds of up to 500MB/s. It is rated for an endurance of 360TB total bytes written (TBW). 1TB Crucial BX500 Internal SSD: $56.99 (Amazon US) - 40% off The 2TB Crucial P3 Plus is an NVMe SSD in the M.2 2280 form factor, utilising a PCIe Gen 4 ×4 interface. It delivers sequential read speeds of up to 5,000MB/s and sequential write speeds of up to 4,200MB/s. Rated for 440TBW, it offers durable performance for everyday and professional use alike. 2TB Crucial P3 Plus NVMe SSD: $113.99 (Amazon US) The 4TB Crucial X10 portable SSD features a USB 3.2 Gen 2x2 interface, supporting data transfer speeds of up to 20Gb/s. The drive delivers sequential read speeds of up to 2,100MB/s, making it suitable for tasks such as video editing, file transfers, and system backups. 4TB Crucial X10 Portable SSD: $246.99 (Amazon US) - 38% off The 2TB SanDisk Extreme Portable SSD comes equipped with a USB 3.2 Gen 2 interface (backwards compatible with USB 3.0 and USB 2.0). It delivers sequential read speeds of up to 1 000 MB/s, promising rapid file transfers and game loading times. Designed, tested, and approved for use with PlayStation 5 consoles, this rugged SSD lets you archive and restore game libraries rapidly. It is IP55‑rated for water and dust resistance as well. 2TB SanDisk Extreme Portable SSD: $178.01 (Amazon US) - 26% off The 1TB Western Digital Blue SA510 SSD connects via SATA III (6Gb/s). It delivers sequential read speeds of up to 560MB/s and write speeds up to 520MB/s, with random performance rated at 90,000 IOPS for reads and 82,000 IOPS for writes. Built on WD’s 3D NAND technology, it carries a 400TBW endurance rating and is backed by a five‑year limited warranty. Finally, it operates safely between 0°C and 70°C (–55°C to 85°C when powered down). 1TB Western Digital WD Blue SA510 Internal SSD: $63.17 (Amazon US) - 26% off This Amazon deal is US-specific and not available in other regions unless specified. If you don't like it or want to look at more options, check out the Amazon US deals page here. Get Prime (SNAP), Prime Video, Audible Plus or Kindle / Music Unlimited. Free for 30 days. You can also check out other SSD deals here. For hard disk drives, you can head over to our HDD deals section to see if anything from there matches your requirements. Make sure you also browse through Amazon US, Amazon UK, and Newegg US to find some other great tech deals. As an Amazon Associate, we earn from qualifying purchases.
    • Look at the fingers especially round the cups, you’d think A needs to add the I together
    • There are too many people doing nothing and just cruising at MS because of how the previous culture was (rest and vest).
  • Recent Achievements

    • Week One Done
      Wayne Robinson earned a badge
      Week One Done
    • One Month Later
      Karan Khanna earned a badge
      One Month Later
    • Week One Done
      Karan Khanna earned a badge
      Week One Done
    • First Post
      MikeK13 earned a badge
      First Post
    • Week One Done
      OHI Accounting earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      681
    2. 2
      ATLien_0
      275
    3. 3
      Michael Scrip
      207
    4. 4
      +FloatingFatMan
      172
    5. 5
      Steven P.
      143
  • Tell a friend

    Love Neowin? Tell a friend!