Jump to content
  • Advertisement
Sign in to follow this  
iwoplaza

FStream Problem

This topic is 2333 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I have a problem with the library "fstream", because I'd like to read 100 characters by using the FOR loop. For example, a text file from I want to read the characters look like this:
A
B
C
D



And I want to read the characters one by one to four variables CHAR using a loop.
But I do not know how to do it sad.png. Can you help?

Thanks in advance.

Share this post


Link to post
Share on other sites
Advertisement
Just checking: is this a homework assignment?
Also, am I right in thinking you want to read 25 groups of 4 characters for a total of 100? And each character is on its own line?

In any case, to get you started:


#include <fstream>
#include <iostream>

int main(int argc, char **argv)
{
if (argc != 2)
return 1;

std::ifstream file(argv[1]);
char ch = 0;

while (file >> ch)
{
std::cout << "read char: " << ch << '\n';
}

return 0;
}
Edited by e?dd

Share this post


Link to post
Share on other sites
edd's method is great, normally a while cycle is used.

I normally use

[source lang="cpp"]while (!file.eof())
{
//DO THE READING HERE
}[/source]

Share this post


Link to post
Share on other sites
Thanks to all, but I solved it for myself smile.png.
I changed the contents of a text file from:
a
b
c
d
...
(one hundred characters)

to:

abcdefghijk ... (one hundred characters)


Instead of loading the characters one by one, I loaded a line of characters to an array of char.
.
Example:


char characters[100];
char loadline[100];
fstream input;
input.open("fontprops.txt");
input >> loadline;
for(int i = 0;i < 100;i++)
{
characters.number = i;
characters.character = loadtext;
}
Edited by iwoplaza

Share this post


Link to post
Share on other sites

Instead of loading the characters one by one, I loaded a line of characters to an array of char.
.
Example:


char loadline[100];
fstream input;
input.open("fontprops.txt");
input >> loadline;
[...]



Unfortunately, this code is very 'dangerous'. If the first string of your file has more than 99 characters (bytes), then your program will blindly read those. According to the C++ standard, once you do something like this, the behaviour of your program is undefined. In reality, what would likely happen is that that the "input >> loadline" line would start scribbling data from the file all over your program's stack, quite possibly corrupting the surrounding data, perhaps even the local variables of the calling function(s). Or it might overwrite the saved return address in the current frame. Or... Whatever happens, it won't be pretty.

Instead, it's best to read in to an std::string, which will ensure the required amount of storage is allocated correctly. Fortunately, the code doesn't require much surgery to do that:


#include <string>

// ...

std::string loadline;
std::ifstream input("fontprops.txt");
input >> loadline;

if (loadline.size() != 100)
{
std::cerr << "expected 100 characters, got " << loadline.size() << std::endl;
return false;
}

for (int i = 0; i < 100; ++i)
{
// use loadline in the same way to get the char at index i
}


Alternatively, if you want bytes rather than formatted chars, you can use std::istream::read(), which takes a numeric parameter specifying the amount of data wanted. Edited by e?dd

Share this post


Link to post
Share on other sites

Thanks to all, but I solved it for myself smile.png.
I changed the contents of a text file from:
a
b
c
d
...
(one hundred characters)

to:

abcdefghijk ... (one hundred characters)


Instead of loading the characters one by one, I loaded a line of characters to an array of char.
.
Example:


char characters[100];
char loadline[100];
fstream input;
input.open("fontprops.txt");
input >> loadline;
for(int i = 0;i < 100;i++)
{
characters.number = i;
characters.character = loadtext;
}



as edd said, that code is dangerous, (That type of code used to be(and might still be, allthough modern languages and some OS features (such as DEP) make it alot easier to avoid) one of the most common causes of security flaws in networked applications, at best it will crash the application, at worst it will allow a hacker to send his own code to your application and force it to execute (by for example overwriting the return address), In your case since the application only runs locally with data provided by you its not a big deal but for any application that deals with sockets or third party files it is essential to get things right and it is better to learn how to do things properly before you write code that will run on someone elses machine.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!