• 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

    • No operating system works well with programs that modify its interface. There will always be bugs, whether it's MacOS or Linux. Windows too, you'll only suffer from bugs using this crap software.
    • KDE brings UI improvements, bug fixes and more to Plasma 6.4 as stable release draws near by David Uzondu With less than a month to the release of Plasma 6.4, the KDE dev team has shared what it has been working on in the latest issue of its weekly roundup. The update shows a heavy focus on user interface polish and a whole slew of bug fixes as the June 17 release date gets closer. The team has pushed a number of UI refinements for the upcoming version. On the System Settings page for Wi-Fi, the network list can now be fully navigated with a keyboard. KDE also disabled the ability to drag and drop displays on top of one another in the monitor settings. This was done because it could create unsupported arrangements that triggered a cascade of strange bugs throughout the system. Waking up a sleeping computer by pressing the power button no longer causes the bizarre logout screen to appear after you unlock it, which is a relief. Alignment issues in the settings page for the Digital Clock widget were also resolved. The list of bug fixes for 6.4 is extensive. The development team has fixed the most common crash affecting the System Monitor and squashed another one related to a divide-by-zero error. For users with multiple monitors, a long-awaited fix has landed that prevents windows from disappearing when the screen they are on gets disconnected. Even the humble Sticky Notes widget received attention; it will no longer freeze the Plasma shell if you place it on a very thick panel. Discover, the software center, also had a bug patched that caused it to crash if closed too quickly after launch. Here's the full list of improvements: Putting a Sticky Note widget on a very thick panel can no longer cause Plasma to freeze; now, you can use a thick panel with a sticky note on it as a notes sidebar. Fixed the most common System Monitor crash. Fixed another crash in System Monitor, this time a divide-by-zero. Fixed a case where xdg-desktop-portal-kde could crash after you choose a video source to start streaming. Fixed a bug that caused Discover to crash if you close it immediately after it launched. Fixed multiple subtle bugs with the screen chooser widget and OSD that caused it to do the wrong thing on rotated screens or when mirroring screens. Fixed a bug that caused the System Settings’ search field not to be focused properly when pressing Ctrl+F while any UI elements in a settings page already had focus. Fixed the root cause of multiple issues involving windows disappearing when you disconnect the screen they’re on. Clicking a button on a desktop widget that opens a menu no longer inappropriately makes the widget enter Widget Edit Mode. Files with a # or ? character in their name or full path are no longer unexpectedly missing from the history lists in Kicker/Kickoff/etc launchers. Fixed a bug that caused the screen chooser window to sometimes not appear as expected when OBS was launched. Fixed a bug that caused tiled windows on a multi-screen setup to lose their tiling settings when the system went to sleep and woke up again. The "Move window to [activity]" feature now works properly when invoked from the Task Manager widget. Fixed a bug in the Kicker Application Menu that caused keyboard navigation not to work if the popup opened with an item under the pointer. In the Overview effect’s grid view, dragging windows tiled on one virtual desktop over to a different virtual desktop now keeps them tiled as expected. The focus may be on the imminent 6.4 release, but work on what comes next never really stops. Looking ahead, development on Plasma 6.5 is already well underway. Just last week, the KDE team brought several performance improvements to Plasma 6.5.0. This week, the team fixed a nagging bug that sometimes caused the Networks widget to think a hotspot was still enabled after disconnecting from Wi-Fi. On the features side, the System Settings' Fonts page now prevents you from breaking your system entirely by setting fonts below 4pt. In addition to that, switching time spans in the Info Center’s energy page now features smooth graph animations. Performance-wise, kwriteconfig should also be faster, allowing changes you made to the keyboard layout using the tool to reflect immediately.
    • Display Driver Uninstaller (DDU) 18.1.1.4 by Razvan Serea Display Driver Uninstaller (DDU) is a utility for completely removing AMD/NVIDIA/INTEL graphics drivers and related packages from your system, attempting to eliminate all leftovers (including registry entries, folders and files, driver store). Though AMD/NVIDIA/INTEL drivers can usually be removed via the Windows Control Panel, this uninstaller tool was created for situations where standard uninstall fails, or when you need to fully remove NVIDIA or ATI graphics card drivers. After using this driver cleaner, your system will behave as though it’s the first time you’re installing a new driver—similar to a fresh Windows installation. As with all such tools, we recommend creating a restore point beforehand, allowing you to undo changes if issues arise. If you're having trouble installing an older or newer driver, try it—there are reports that it resolves such problems. Recommended usage: The tool can be used in Normal mode but for absolute stability when using DDU, Safemode is always the best. Make a backup or a system restore (but it should normally be pretty safe). It is best to exclude the DDU folder completely from any security software to avoid issues. You do NOT need to uninstall the driver prior using DDU. Requirements: .NET Framework 4.8 Compatible with Windows 7, 8, 8.1, 10, and 11 (32-bit or 64-bit) Note: Using on Insider Preview builds is at your own risk. Display Driver Uninstaller (DDU) 18.1.1.4 changelog: Intel: Added NPU presence detection before removing shared DLL files (these were previously left to prevent potential NPU-related issues). Intel: Added optional NPU removal Improved "Extension" driver removal process. Updated several translations. Download: Display Driver Uninstaller 18.1.1.4 | 1.7 MB (Freeware) Download: DDU Portable | 1.2 MB Links: Display Driver Uninstaller Home Page | Screenshot | Forum Get alerted to all of our Software updates on Twitter at @NeowinSoftware
    • That is what I also think to a point. How is 26 necessarily different than just another iteration like 18, 19, 20, etc? At first I think it would be better for Apple to use 2026, 2027, and then maybe truncate it to just 28, 29, and so on. Granted, I also think it makes more sense to use the year when it was released (2025 or 25), not 26/2026. Maybe Apple's thinking is as stated by Aditya that the bulk of a release being the current release is during the following year (2026, for example) after it is released (2025, for example). There are other examples of these sorts of things. In the NBA, the season has always started in the Fall and ends in the Spring. When the season ends is how the season is named. So, this is the 2025 NBA season and the Pacers and Thunder are playing to be the 2025 NBA Champions. The NFL starts in the Fall and the end of the season is always in the beginning of the next year as well. The Super Bowl was played on February 9, 2025, but that was the end of the 2024 NFL season. So, contrary to the NBA, the NFL names it season based on when it starts, not when it ends. Maybe that is because more of the NFL season is played at the end of the year (2024 in the most recent example) whereas most of the NBA season is played in the first half of the following year (2025 in the current example).
  • Recent Achievements

    • Week One Done
      abortretryfail earned a badge
      Week One Done
    • First Post
      Mr bot earned a badge
      First Post
    • First Post
      Bkl211 earned a badge
      First Post
    • One Year In
      Mido gaber earned a badge
      One Year In
    • One Year In
      Vladimir Migunov earned a badge
      One Year In
  • Popular Contributors

    1. 1
      +primortal
      495
    2. 2
      snowy owl
      252
    3. 3
      +FloatingFatMan
      251
    4. 4
      ATLien_0
      228
    5. 5
      +Edouard
      191
  • Tell a friend

    Love Neowin? Tell a friend!