Incomplete words read from file

Ali Çehreli acehreli at yahoo.com
Thu Nov 18 00:42:49 UTC 2021


On 11/17/21 3:46 PM, pascal111 wrote:
 > I made small program that shows the content of textual files, and it
 > succeeded to show non-English (Ascii code) language, but in many lines
 > some words are not complete and their rests are in next lines, how can
 > fix it?

D assumes UTF-8 encoding by default. If the file is not UTF-8, 
std.encoding.transcode may be useful:

   https://dlang.org/library/std/encoding/transcode.html

Of course, the encoding of the file must be known. However, I think your 
file is already UTF-8.

 > "https://i.postimg.cc/rpP7dQYH/Screenshot-from-2021-11-18-01-40-43.png"

The characterns indeed look correct. I wonder whether the lines don't 
fit your terminal's width and the terminal is wrapping them?

If you want to wrap the lines programmatically, there std.string.wrap:

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

Because we've talked about parts of your program earlier, I take liberty 
to comment on it. :) Then I will show an alternative version below.

 > '''d
 >
 > // D programming language
 >
 > import std.stdio;
 > import std.string;
 >
 > int main()
 > {
 >
 > string s;

It is a general guideline that variables should be defined as close to 
their first use as possible. This allows for more readable, 
maintainable, and refactorable code.

 > char[] f;

I was able to make this a string in the program below by calling the 
no-parameter version of readln().

 >
 >
 > try{
 > write("Enter file name and path: ");
 > readln(f);
 > f=strip(f);}

Because errors can occur in other parts of the program as well, you can 
wrap the whole code in a try block.

 >
 > catch(Exception err){
 > stderr.writefln!"Warning! %s"(err.msg);}

It is better to either return with a non-zero error code here or do 
something about the error. For example:

   writeln("Using the default file.")
   f = "my_default_file".dup;

But I think it is better to return 1 there.

 >
 >
 > File file = File(f, "r");
 >
 > while (!file.eof()) {

There is byLine (and byLineCopy) that produce a file line-by-line, which 
you can use here as well.

 >        s = chomp(file.readln());
 >        writeln(s);
 >     }
 >
 > file.close();

Although harmless, you don't need to call File.close because it is 
already called by the destructor of File.

 >
 > return 0;
 >
 > }
 >
 >
 > '''

Here is an alternative:

import std.stdio;
import std.string;

int main() {
   try {
     printFileLines();

   } catch(Exception err){
     stderr.writefln!"Warning! %s"(err.msg);
     return 1;
   }

   return 0;
}

void printFileLines() {
   write("Enter file name and path: ");
   string f = strip(readln());

   File file = File(f, "r");

   foreach (line; file.byLine) {
     const s = chomp(line);
     writeln(s);
   }
}

Ali



More information about the Digitalmars-d-learn mailing list