Jump to content

  • Log In with Google      Sign In   
  • Create Account


FStream Problem


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
5 replies to this topic

#1 iwoplaza   Members   -  Reputation: 156

Like
0Likes
Like

Posted 19 July 2012 - 08:30 AM

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 Posted Image. Can you help?

Thanks in advance.

Sponsor:

#2 e‍dd   Members   -  Reputation: 2105

Like
2Likes
Like

Posted 19 July 2012 - 08:40 AM

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, 19 July 2012 - 04:07 PM.


#3 Acotoz   Members   -  Reputation: 73

Like
-2Likes
Like

Posted 19 July 2012 - 08:59 AM

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]

#4 iwoplaza   Members   -  Reputation: 156

Like
0Likes
Like

Posted 19 July 2012 - 11:11 PM

Thanks to all, but I solved it for myself Posted Image.
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[i].number = i;
	  characters[i].character = loadtext[i];
}

Edited by iwoplaza, 19 July 2012 - 11:12 PM.


#5 e‍dd   Members   -  Reputation: 2105

Like
1Likes
Like

Posted 20 July 2012 - 07:31 AM

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[i] 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, 20 July 2012 - 07:35 AM.


#6 SimonForsman   Crossbones+   -  Reputation: 5772

Like
0Likes
Like

Posted 23 July 2012 - 11:09 AM

Thanks to all, but I solved it for myself Posted Image.
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[i].number = i;
	  characters[i].character = loadtext[i];
}


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.
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!




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS