Thread overview
writeln Function while reading a Text File is printing appending text "before text" and "after text" at the same position
Jun 03, 2020
BoQsc
Jun 03, 2020
ttk
Jun 03, 2020
BoQsc
Jun 03, 2020
BoQsc
Jun 03, 2020
ttk
Jun 03, 2020
BoQsc
Jun 03, 2020
H. S. Teoh
Jun 05, 2020
Ali Çehreli
June 03, 2020
> C:\Users\vaida\Desktop\Associative Array Sorting> rdmd testingGround.d
> 0.  The quick brown fox jumps over the lazy dog
> nonononoahahahaha Sphinx of black quartz, judge my vow.
> 2. # How vexingly quick daft zebras jump!
> 3. # The five boxing wizards jump quickly
> 4. # Maecenas consectetur risus a lacus sodales iaculis.
> 5. # Morbi sed tortor sollicitudin, pharetra massa egestas, congue massa.
> 6. # Sed sit amet nisi at ligula ultrices posuere quis nec est.
> 7. # Mauris vel purus viverra, pellentesque elit id, consequat felis.

Here you can see ". hahahahahahaha" and "nononono" and even lineNumber is being merged into the same position. Why is this happening and can this be simply resolved?


testingGround.d
> import std.stdio;
> import std.algorithm;
> 
> int lineNumber;
> void main(){
> 
> 	File exampleFile = File("exampleText.txt");
> 	lineNumber = 0;
> 	foreach(line; exampleFile.byLine){
> 		
> 		if (line == " Sphinx of black quartz, judge my vow.\u000D"){
> 			writeln(lineNumber, ". hahahahahahaha", line, "nononono");
> 			
> 		} else {
> 			writeln( lineNumber, ". ", line);
> 		}
> 		
> 		lineNumber++;
> 	}
> }

exampleText.txt
>  The quick brown fox jumps over the lazy dog
>  Sphinx of black quartz, judge my vow.
> # How vexingly quick daft zebras jump!
> # The five boxing wizards jump quickly
> # Maecenas consectetur risus a lacus sodales iaculis.
> # Morbi sed tortor sollicitudin, pharetra massa egestas, congue massa.
> # Sed sit amet nisi at ligula ultrices posuere quis nec est.
> # Mauris vel purus viverra, pellentesque elit id, consequat felis.
June 03, 2020
On Wednesday, 3 June 2020 at 18:23:51 UTC, BoQsc wrote:
> Here you can see ". hahahahahahaha" and "nononono" and even lineNumber is being merged into the same position. Why is this happening and can this be simply resolved?

Your string in "line" has a carriage return character at the end, which moves the cursor to the beginning of the display row.

If you remove this trailing carriage return character (0x0D) it will display correctly.

With the carriage return character in place, everything written to your terminal after the carriage return starts at the beginning of the row.

June 03, 2020
On 6/3/20 2:23 PM, BoQsc wrote:
>> C:\Users\vaida\Desktop\Associative Array Sorting> rdmd testingGround.d
>> 0.  The quick brown fox jumps over the lazy dog
>> nonononoahahahaha Sphinx of black quartz, judge my vow.
>> 2. # How vexingly quick daft zebras jump!
>> 3. # The five boxing wizards jump quickly
>> 4. # Maecenas consectetur risus a lacus sodales iaculis.
>> 5. # Morbi sed tortor sollicitudin, pharetra massa egestas, congue massa.
>> 6. # Sed sit amet nisi at ligula ultrices posuere quis nec est.
>> 7. # Mauris vel purus viverra, pellentesque elit id, consequat felis.
> 
> Here you can see ". hahahahahahaha" and "nononono" and even lineNumber is being merged into the same position. Why is this happening and can this be simply resolved?
> 
> 
> testingGround.d
>> import std.stdio;
>> import std.algorithm;
>>
>> int lineNumber;
>> void main(){
>>
>>     File exampleFile = File("exampleText.txt");
>>     lineNumber = 0;
>>     foreach(line; exampleFile.byLine){
>>
>>         if (line == " Sphinx of black quartz, judge my vow.\u000D"){
>>             writeln(lineNumber, ". hahahahahahaha", line, "nononono");
>>
>>         } else {
>>             writeln( lineNumber, ". ", line);
>>         }
>>
>>         lineNumber++;
>>     }
>> }
> 
> exampleText.txt
>>  The quick brown fox jumps over the lazy dog
>>  Sphinx of black quartz, judge my vow.
>> # How vexingly quick daft zebras jump!
>> # The five boxing wizards jump quickly
>> # Maecenas consectetur risus a lacus sodales iaculis.
>> # Morbi sed tortor sollicitudin, pharetra massa egestas, congue massa.
>> # Sed sit amet nisi at ligula ultrices posuere quis nec est.
>> # Mauris vel purus viverra, pellentesque elit id, consequat felis.

\u000D is a carriage return, which means that the terminal moves the insertion point to the front of the line, and writes "nononono" over the original text there. (BTW, you can just do \r instead)

How do you fix it? I don't know what your requirements are. I don't know what you are expecting.

-Steve
June 03, 2020
On Wednesday, 3 June 2020 at 18:49:38 UTC, ttk wrote:
> On Wednesday, 3 June 2020 at 18:23:51 UTC, BoQsc wrote:
>> Here you can see ". hahahahahahaha" and "nononono" and even lineNumber is being merged into the same position. Why is this happening and can this be simply resolved?
>
> Your string in "line" has a carriage return character at the end, which moves the cursor to the beginning of the display row.
>
> If you remove this trailing carriage return character (0x0D) it will display correctly.
>
> With the carriage return character in place, everything written to your terminal after the carriage return starts at the beginning of the row.

It seems to be correct.
Removing the last element of the string got it resolved.
Might not be the best way and adding additional check for carriage return before removing the element would be better, so this is only initial proof.

Command Prompt Output
> C:\Users\vaida\Desktop\Associative Array Sorting> rdmd associativeArraySorting.d
> 0.  The quick brown fox jumps over the lazy dog
> 1. hahahahahahaha Sphinx of black quartz, judge my vow.nononono
> 2. # How vexingly quick daft zebras jump!
> 3. # The five boxing wizards jump quickly
> 4. # Maecenas consectetur risus a lacus sodales iaculis.
> 5. # Morbi sed tortor sollicitudin, pharetra massa egestas, congue massa.
> 6. # Sed sit amet nisi at ligula ultrices posuere quis nec est.
> 7. # Mauris vel purus viverra, pellentesque elit id, consequat felis.


testingGround.d
> import std.stdio;
> import std.algorithm;
> 
> 
> 
> int lineNumber;
> void main(){
> 
> 	File exampleFile = File("exampleText.txt");
> 	lineNumber = 0;
> 	foreach(line; exampleFile.byLine){
> 		
> 		if (line == " Sphinx of black quartz, judge my vow.\u000D"){
> 			writeln(lineNumber, ". hahahahahahaha", line.remove(line.length - 1), " nononono");
> 			
> 		} else {
> 			writeln( lineNumber, ". ", line);
> 		}
> 		
> 		lineNumber++;
> 	}
> }
June 03, 2020
> Removing the last element of the string got it resolved.
> Might not be the best way and adding additional check for carriage return before removing the element would be better, so this is only initial proof.


Improved example with the above comments resolved.

testingGround.d
> import std.stdio;
> import std.algorithm;
> 
> 
> 
> int lineNumber;
> void main(){
> 
> 	File exampleFile = File("exampleText.txt");
> 	lineNumber = 0;
> 	foreach(line; exampleFile.byLine){
> 		
> 		if (line == " Sphinx of black quartz, judge my vow.\u000D"){
> 			if (line[line.length -1] == '\u000D'){
> 				line = line.remove(line.length - 1);
> 			}
> 			writeln(lineNumber, ". hahahahahahaha", line, " nononono");
> 			
> 		} else {
> 			writeln( lineNumber, ". ", line[line.length -1]);
> 		}
> 		
> 		lineNumber++;
> 	}
> }
June 03, 2020
On Wednesday, 3 June 2020 at 19:53:03 UTC, BoQsc wrote:
>> Removing the last element of the string got it resolved.
>> Might not be the best way and adding additional check for carriage return before removing the element would be better, so this is only initial proof.
>
>
> Improved example with the above comments resolved.

That works, but consider using chomp() instead.

https://dlang.org/phobos/std_string.html#.chomp


June 03, 2020
On Wednesday, 3 June 2020 at 20:05:52 UTC, ttk wrote:
> On Wednesday, 3 June 2020 at 19:53:03 UTC, BoQsc wrote:
>>> Removing the last element of the string got it resolved.
>>> Might not be the best way and adding additional check for carriage return before removing the element would be better, so this is only initial proof.
>>
>>
>> Improved example with the above comments resolved.
>
> That works, but consider using chomp() instead.
>
> https://dlang.org/phobos/std_string.html#.chomp

Chomp sounds kind of funny hahaha.
Who came up with these function names? Walter Bright?
Anyways, Chomp's way looks way more simple. Thanks.

> import std.stdio;
> import std.algorithm;
> import std.string;
> import std.uni : lineSep;
> 
> int lineNumber;
> void main(){
> 
> 	File exampleFile = File("exampleText.txt");
> 	lineNumber = 0;
> 	foreach(line; exampleFile.byLine){
> 		
> 		if (line == " Sphinx of black quartz, judge my vow.\u000D"){
> 			writeln(lineNumber, ". hahahahahahaha", chomp(line, "\r"), " nononono");
> 			
> 		} else {
> 			writeln( lineNumber, ". ", line);
> 		}
> 		
> 		lineNumber++;
> 	}
> }
June 03, 2020
On Wed, Jun 03, 2020 at 08:43:43PM +0000, BoQsc via Digitalmars-d-learn wrote:
> On Wednesday, 3 June 2020 at 20:05:52 UTC, ttk wrote:
[...]
> > That works, but consider using chomp() instead.
> > 
> > https://dlang.org/phobos/std_string.html#.chomp
> 
> Chomp sounds kind of funny hahaha.
> Who came up with these function names? Walter Bright?
> Anyways, Chomp's way looks way more simple. Thanks.

Chomp comes from Perl.


T

-- 
For every argument for something, there is always an equal and opposite argument against it. Debates don't give answers, only wounded or inflated egos.
June 05, 2020
On 6/3/20 1:43 PM, BoQsc wrote:

> Chomp sounds kind of funny hahaha.

Also consider strip, stripLeft, and stripRight. (Not because they may be funny but because they are useful as well. :) )

Ali