• 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

    • Is the Start menu needed? Yes. Is it needed in its current form? No. I run lubuntu, it has all my apps sorted into categories, a bunch of preferences and system tools, the option to turn off, and search. It's all in a small rectangle and does everything you need it to.
    • Star Citizen Alpha 4.2 update lands with radiation hazards, dynamic rain, and more by Pulasthi Ariyasinghe The crowd-funded sci-fi RPG Star Citizen has received another update to its public alpha build. This time, developer Cloud Imperium Games has delivered new features like radiation as a brand-new hazard, irradiated creatures, the first implementation of a dynamic weather system for planets, and more. Dubbed Storm Breaker, Alpha update 4.2's cinematic trailer can be caught above, showing off the new sandbox activity. Storm Breaker is the name of the new sandbox activity too, continuing the ongoing Regen Crisis narrative. Players will be going to Pyro 1 and 4 while uncovering the experimentation secrets of the Associated Sciences & Development company while also weathering a never-ending storm, irradiated zones, and dangerous creatures to complete the event's tasks for hard-earned loot. Speaking of radiation, players will need to wear specialized gear and navigate carefully whenever they come across these special hazardous zones on planets. "This update adds new Radiation accumulation, resistance, and falloff thresholds to player status effects," says the developer. "These effects will appear as new visual and player status cues with REMs on the HUD and can cause consequences resulting in player injury or death if not treated." Locations on Stanton and Pyro planets can now have rain happen on them at various locations and times. Cloud Imperium calls this the first implementation of its Genesis: Dynamic Weather system. When ready, the full version of this tech will be rolling out to many more planets and will supposedly have rain and cloud formations, lightning, relevant audio, water pooling, and clothing shaders for wetness. Other changes of the update include better missile and torpedo tracking, new explorable locations, irradiated juvenile sandworms to fight, fixes for space stations and landing zones to reduce clipping and glitches, and much more. The complete release notes for the update can be found here. Star Citizen Alpha 4.2: Storm Breaker is now available for all backers in the Live channel.
    • It's likely going to be the on-board models that have been finetuned to perform all the Galaxy AI processing needs, thus eliminating any need for the cloud/subscription...
    • They did remove the Start button with Windows 8, but everyone had their pitchforks out. That OS had its many issues, but you could work on a desktop environment without the Start. Safe to say not many liked it.
  • 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
      680
    2. 2
      ATLien_0
      271
    3. 3
      Michael Scrip
      208
    4. 4
      +FloatingFatMan
      170
    5. 5
      Steven P.
      147
  • Tell a friend

    Love Neowin? Tell a friend!