FStream Problem

Started by
4 comments, last by SimonForsman 11 years, 9 months ago
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.
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;
}
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]
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;
}

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.

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.
[size="1"]I don't suffer from insanity, I'm enjoying every minute of it.
The voices in my head may not be real, but they have some good ideas!

This topic is closed to new replies.

Advertisement