digitalmars.D.learn - Macintosh text file with invalid line breaks are created
- Andre Pany (25/25) Sep 27 2016 Hi,
- Vladimir Panteleev (7/30) Sep 28 2016 Since the file is opened in text mode (which is the default), the
- Andre Pany (12/20) Sep 28 2016 Thank you so much, I was already getting crazy about this. I just
Hi, following application creates a text file with strange content: void writeTextFile(string filePath, string text) { import std.stdio: File; auto f = File(filePath, "w"); f.write(text); f.close(); } void main() { import std.ascii: newline; string s = "a=1"~newline~"b=2"; writeTextFile("./test.txt", s); } Notepad++ detects the file as macintosh UTF8 file. The file has following content: a=1CR CRLF b=2 Where the first CR comes from? Is this a bug? dmd v2.071.2 on win10 Kind regards André
Sep 27 2016
On Wednesday, 28 September 2016 at 06:52:51 UTC, Andre Pany wrote:Hi, following application creates a text file with strange content: void writeTextFile(string filePath, string text) { import std.stdio: File; auto f = File(filePath, "w"); f.write(text); f.close(); } void main() { import std.ascii: newline; string s = "a=1"~newline~"b=2"; writeTextFile("./test.txt", s); } Notepad++ detects the file as macintosh UTF8 file. The file has following content: a=1CR CRLF b=2 Where the first CR comes from? Is this a bug? dmd v2.071.2 on win10Since the file is opened in text mode (which is the default), the C runtime automatically translates the single \n to a \r\n pair when writing the file. Since std.ascii.newline is defined to be "\r\n" on Windows, it ends up being written as "\r\r\n". You could either open the file in binary mode (use "wb" as the second argument), or always use "\n" for line separators.
Sep 28 2016
On Wednesday, 28 September 2016 at 16:53:24 UTC, Vladimir Panteleev wrote:On Wednesday, 28 September 2016 at 06:52:51 UTC, Andre Pany wrote: Since the file is opened in text mode (which is the default), the C runtime automatically translates the single \n to a \r\n pair when writing the file. Since std.ascii.newline is defined to be "\r\n" on Windows, it ends up being written as "\r\r\n". You could either open the file in binary mode (use "wb" as the second argument), or always use "\n" for line separators.Thank you so much, I was already getting crazy about this. I just checked whether this information is included in library documentation for std.stdio. If I havent't miss s.th. this isn't mentioned directly but only as a side information in this sentence: Use std.ascii.newline for portability (unless the file was opened in text mode). I will create a bug report, for users without C knowledge, this is a trap:) Kind regards André
Sep 28 2016