www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - How can I easily determine the last charachter of a file?

reply seany <seany uni-bonn.de> writes:
Hello

Consider the content of a file

````
First line \n
Second line ....
....
data data data data  ... last char

````

My goal is to find out whether the last character is a new line 
or not. Please not, it will be sufficient if this works on Linux.

More specifically I want to insert a new line at the end of the 
file. File.writeline inserts a line at the end of the _newly 
added line_.

Thus if I had


````
First line \n
Second line ....
....
data data data data  ... non-NL-char

````

and wanted to insert : `newline-word-word-word ... non-NLchar`

Via `file.writeln`, it would end up as

````
First line \n
Second line ....
....
data data data data  ... non-NL-char{no newline or whitespace 
here}Newline-word-word-word ... non-NLchar{newline}

````

This is not unexpected. But, I want to make sure, that my 
appending automatically adds a new line. However, it should not 
add empty lines.

One brute force method is to copy every line of the file to a 
temp file or in the RAM and then write back in the original file. 
I would like to avoid that if possible.

Thanks.
Feb 14 2023
next sibling parent Steven Schveighoffer <schveiguy gmail.com> writes:
```d
myFile.seek(-1, SEEK_END);
ubyte c[1];
myFile.rawRead(c[]);
if(c[0] == '\n') // ends in newline
```

-Steve
Feb 14 2023
prev sibling parent ProtectAndHide <ProtectAndHide gmail.com> writes:
On Tuesday, 14 February 2023 at 18:30:05 UTC, seany wrote:
 Hello

 Consider the content of a file

 ````
 First line \n
 Second line ....
 ....
 data data data data  ... last char

 ````

 My goal is to find out whether the last character is a new line 
 or not. Please not, it will be sufficient if this works on 
 Linux.

 More specifically I want to insert a new line at the end of the 
 file. File.writeline inserts a line at the end of the _newly 
 added line_.

 Thus if I had


 ````
 First line \n
 Second line ....
 ....
 data data data data  ... non-NL-char

 ````

 and wanted to insert : `newline-word-word-word ... non-NLchar`

 Via `file.writeln`, it would end up as

 ````
 First line \n
 Second line ....
 ....
 data data data data  ... non-NL-char{no newline or whitespace 
 here}Newline-word-word-word ... non-NLchar{newline}

 ````

 This is not unexpected. But, I want to make sure, that my 
 appending automatically adds a new line. However, it should not 
 add empty lines.

 One brute force method is to copy every line of the file to a 
 temp file or in the RAM and then write back in the original 
 file. I would like to avoid that if possible.

 Thanks.
Building on previous response: module test; safe: import std; void main() { File myFile = "somefile.txt"; myFile.seek(-1, SEEK_END); ubyte[1] c; () trusted { myFile.rawRead(c[]); } (); if(ControlChar.lf == c[0]) // is this portable?? writeln("yep, last char is a linefeed."); else writeln("nope. last char is not a linefeed."); }
Feb 15 2023