ofstream (standard C++ file output) not working

I was testing a logging system, where you would be able to log data to a logfile on the cRIO, and then FTP to it to see what happened. I used a modified simpleRobot, and added a streambuf* to the variable list, a ofstream, initialized to “cRIOUserLog.log”, and then rdbuf to clog. but clog<<“Logging Test”<<endl; (which should also flush) does not appear to do anything. I FTP’d to the cRIO, and looked in most of the directories, but I cannot find cRIOUserLog.log. Is there something I need to do? I remember someone somewhere in some thread somewhile ago saying something about a write flag, but I was able to use IMAQ_write_png (don’t think this is the actual name) to write PNG’s to the cRIO.
Relevant code:

class SuperSimpleRobot
{
streambuf* ofsTclog;
ofstream UserLog;
//...
public:
SuperSimpleRobot():
UserLog("cRIOUserLog.log")//...
{
	ofsTclog=UserLog.rdbuf();
	clog.rdbuf(ofTclog);
	//...
	clog<<"Logging Test"<<endl;
}
//...
};

Try calling Priv_SetWriteFileAllowed(1) in the constructor.

I’ve never used ofstream on the cRIO, but I’ve gotten C-style file I/O to work (FILE*, fopen(), fwrite(), etc.).

Ditto. C-style has always run fine with me. If you know what you’re doing it’s not that hard to make a class similar to ofstream with c-style calls.

Thanks! I will try that next time I get a chance.

I know about C IO, but like C++ much better due to its simplicity, and ease of use by semi-incompetent people

What I was saying is that if you can’t get ofstream to work, write your own class that copies its behavior and use the C-style I/O in the member functions.

if C style works, why would ofstream not work?

The cRIO requires that you call Priv_SetWriteFileAllowed(1) *before *you can create files on the cRIO file system. You seem to be instantiating your ofstream object in the initialization list of your main robot class; in this case, the ofstream would attempt to create the specified file BEFORE you have allowed such an activity to take place (even if you call Priv_SetWriteFileAllowed(1) in your robot class’s constructor - the initialization list gets executed first).

Also, ofstream has several methods that can be useful in diagnosing what has gone wrong. In particular, look at is_open(), good(), fail(), bad(), rdstate() here: http://www.cplusplus.com/reference/iostream/ofstream/

Hope this helps!

any files?
when we saved camera png’s we did not have to call Priv_SetWriteFileAllowed(1)

It’s a great question, but I’ve never had any issues reading/writing to the robot using C file I/O, and I’ve never called Priv_SetWriteFileAllowed(1). I know my suggestion is more of a workaround than a real answer, but I just thought it might help.

I got this from cprogramming.com:
#include <fstream>
#include <iostream>

using namespace std;

int main()
{
char str[10];

//Creates an instance of ofstream, and opens example.txt
ofstream a_file ( “example.txt” );
// Outputs to example.txt through a_file
a_file<<“This text will now be inside of example.txt”;
// Close the file stream explicitly
a_file.close();
//Opens for reading the file
ifstream b_file ( “example.txt” );
//Reads one string from the file
b_file>> str;
//Should output ‘this’
cout<< str <<"
";
// b_file is closed implicitly here
}
This is how it is done in c++, for both input and output-this may not help, because I do not know how it will work with the robot, put it works for regular programs. Also, this only works for text files to my knowledge…

karatekid, I don’t think you know what this thread is about. I know how to use o/i/fstream, but cannot find the file it (supposedly)creates. This format (should) work for the robot, as well as any other target supporting C++ io. And it works for binary fills also

Another thought: would I have to use /myfile instead of just myfile?

Sorry?

Any luck so far or is it still not working?

Also, I don’t remember needing a forward slash in front of the filename when saving.

In Java, I recall I had to use a “file://” prefix on my filename (for example: “file://mylog.txt”) in order to get file creation to work. Perhaps you have to do the same thing here?

Haven’t tried to do it yet, yesterday we we only able to get LV/WR/NB installed. I think I might be able to test it Thursday, but definitely by Saturday.

Interesting Jared341, I will try this.

Did you or anyone else successfully get a log running on their cRio? We are trying to do something similar, and we have had consistent success with creating the file but very spotty success when writing to it (depending on where the lines are added in the code). Sometimes it works sometimes it doesn’t.

I know this is quite a bump, but now I’m even having problems using C file I/O with FILE* pointers. I’ve called Priv_SetWriteAllowed(1) and still weird stuff happens. Sometimes things work fine, but there’s a boat load of issues most of the time:

  • While some files write fine, others don’t write at all, and still others write nothing but whitespace.
  • fwrite() reformats strings for some bizarre reason. Example: I wanted to print some formatted data into a .csv (comma seperated value) file. I used sprintf() to print some floats with some commas, carraige returns, and line feeds. Calling printf() on the string created with sprintf() yields what I would expect, but when I write the exact same string to the file with fwrite(), every float is smaller by two orders of magnitude.

Does anybody have any idea what could be causing this? It’s making things very difficult and I can’t imagine why it would be happening.

I’ve found that some parts of the STL do not work with well/at all Wind River. I tried to use std::fstream to store some packet data, but had to use c-style file I/O for it to work.

C-style file I/O isn’t working for me at all either… :confused:

Interesting. What permissions are you using? I used “w”.