| Thread overview | ||||||
|---|---|---|---|---|---|---|
|
June 20, 2013 Read a file to the end, new data is appended, no more is read? | ||||
|---|---|---|---|---|
| ||||
I have a simple problem, I want to open a file and read data from it. When the file changes, i will read more data. The trouble is i only want to open the file once.
Here's the simplified code:
import core.thread;
import std.stdio;
void main(string[] args)
{
auto file = File("file.txt", "r");
string line;
writeln("First Read:");
while ((line = file.readln()) !is null)
{
write(line);
}
Thread.sleep(dur!("seconds")(5)); // <-- More data is appended to the file while waiting here.
writeln("Second Read:");
while ((line = file.readln()) !is null) // <-- Error! New data is not read!
{
write(line);
}
}
I read the file, then when its paused, i add new lines to the opened file. When the program resumes it totally ignores the new lines. doh!
I guess this is the result of buffering somewhere so i've tried all sorts to try and escape this behaviour, including:
file.clearerr()
file.seek()
file.flush()
Nothing seems to work. What am i missing? It must be something simple. Any ideas?
| ||||
June 20, 2013 Re: Read a file to the end, new data is appended, no more is read? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Gary Willoughby | auto file = File("file.txt", "r");
char[1024] buffer;
char[] line;
writeln("First Read:");
while ((line = file.rawRead(buffer)) !is null)
{
write(line);
}
Thread.sleep(dur!("seconds")(5));
writeln("Second Read:");
while ((line = file.rawRead(buffer)) !is null)
{
write(line);
}
Tried using the raw access commands still no joy. So i guess it's still the same issue.
Also tried C stdio too.
char[1024] buffer;
ulong offset;
FILE* file = fopen("text.txt", "r");
printf("First Read:\n");
while(fgets(buffer.ptr, buffer.length, file) !is null)
{
printf("%s", buffer.ptr);
}
offset = ftell(file);
clearerr(file);
Thread.sleep(dur!("seconds")(5));
fseek(file, offset, SEEK_SET);
printf("Second Read:\n");
while(fgets(buffer.ptr, buffer.length, file) !is null)
{
printf("%s", buffer.ptr);
}
fclose(file);
Any ideas?
| |||
June 20, 2013 Re: Read a file to the end, new data is appended, no more is read? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Gary Willoughby | On 06/20/2013 07:10 AM, Gary Willoughby wrote: > I have a simple problem, I want to open a file and read data from it. > When the file changes, i will read more data. The trouble is i only want > to open the file once. > > Here's the simplified code: > > import core.thread; > import std.stdio; > > void main(string[] args) > { > auto file = File("file.txt", "r"); > > string line; > > writeln("First Read:"); > > while ((line = file.readln()) !is null) > { > write(line); > } > > Thread.sleep(dur!("seconds")(5)); // <-- More data is appended to > the file while waiting here. > > writeln("Second Read:"); > > while ((line = file.readln()) !is null) // <-- Error! New data is > not read! > { > write(line); > } > } > > I read the file, then when its paused, i add new lines to the opened > file. When the program resumes it totally ignores the new lines. doh! > > I guess this is the result of buffering somewhere so i've tried all > sorts to try and escape this behaviour, including: > > file.clearerr() > file.seek() > file.flush() > > Nothing seems to work. What am i missing? It must be something simple. > Any ideas? This must be platform-dependent. Your program works as expected under my Scientific Linux distribution. (Same as Red Hat.) I have tried four kinds of modifications to the file: 1) Append a new line: works as expected echo new line >> file.txt 2) Overwrite the same file: works as expected echo new content > file.txt 3) Delete the file and recreate: works as expected rm file.txt; echo new content > file.txt 4) Rename the file: works better than expected :) mv file.txt file2.txt; echo new line >> file2.txt In any case, there must be lots to learn from the 'tail' utility. Its '-f' command line switch achieves what you need, and '-F' achieves more than what you need: http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/tail.c Ali | |||
June 20, 2013 Re: Read a file to the end, new data is appended, no more is read? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | > This must be platform-dependent. Your program works as expected under my Scientific Linux distribution. (Same as Red Hat.)
> Ali
You're right, it seems to be a Mac OS limitation. It works fine here on Ubuntu.
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply