Re: reading from a temp file
Michael DOUBEZ <michael.doubez@free.fr> wrote:
On Jun 28, 10:37 am, Ian Collins <ian-n...@hotmail.com> wrote:
On 06/28/11 08:34 PM, Ruben Safir wrote:
any clue why this isn't retrieving the contents of the temp file
Question Deck::create_question(WINDOW* menu_win, std::ostream&os ,st=
d::istream&in ){
char default_editor[20000] = "vi ";
char * editor;
char tmp[4096];
char path[] = "/tmp/fileXXXXXX";
Why don't you use strings?
because mkstemp expect a char* that is modified. A solution is to
using std::vector<char> instead.
std::vector<char> or std::vector<char *> ?
int fd;
fd = mkstemp(path);
editor = getenv("EDITOR");
if (editor == NULL){
editor = default_editor;
}
strcat(editor, path);
char quest_prompt[] = "Edit Your Question";
.....
std::string input_q, input_a;
while( ( c=wgetch(quest_win) ) ){
if ( (c == 10) ){
def_prog_mode();
endwin();
What are these?
system(editor);
reset_prog_mode();
and this?
A gnu extension for building a filebuf from a file descriptor. IMO
closing the fildescriptor returned and using a simple ifstream with
path, would be less trouble.
Those above are part of ncures.h, but those below as was you describe.
In particular, the openmode are not good: binary will not translate
carriage return and app is irrelevant in input mode (and input mode is
missing). Use plain std::ios::in instead.
The editor is creating a text file so you might be correct, but I don't
think I want carriage returns altered or interpreted, just eventually
dumped into a data file at 4096 bit clips. And I don't want to deal
with deliminators or terminators on input, or output, which is a problem
with getline and getchar. I want them included in the input stream,
whole.
I don't know how it works in conccurent access, stdio_sync_filebuf<>
may be required here (with minimal buffer size in parameter for good
measure).
It didn't have trouble with two seperate streams from the same fd. I
did have trouble using one stream for both in and out.
__gnu_cxx::stdio_filebuf< char> tmpfile_buf(f=
d, std::ios::binary|std::ios::app);
What's one of those?
std::istream is(&tmpfile_buf);
is.seekg(0, std::ios::beg);
seekg is not guaranteed to work
Upon input? It didn't work away. I thought maybe I as set to the end
of the stream but it didn't like binary mode at all, and the eof bits
behaved as I expected so I can only guess that it was behaving OK.
while(is){
is.read( tmp, 4096);
std::cerr<< "What did we read"<< tmp<< =
std::endl;
input_q = tmp;
}
tmpfile_buf.close();
Note that you can dump the content of a file with:
std::err<<is.rdbuf();
I want a guaranteed chunk of 4096, no greater.