Question

Can someone please solve this mystery for me...?
I read about the differences between '/r' and '/n', and that's not what I want to ask...

Consider this two files:
config.txt:

home/my_user/Documents/prog/my_folder
home/my_user/Documents/prog/IO/input_for_prog.txt
home/my_user/Documents/prog/IO/correct_output.txt

test.txt:

This is a test file
Why isn't there carriage return char
at the end of each line in this file?

Now, consider the following code:

int main(int argc, char* argv[]) {

    int fd=open(argv[1], O_RDONLY);
    if (fd==-1) {
        perror("Error opening");
        return -1;
    }

    char ch;
    int ret_code;

    while ((ret_code=read(fd, &ch, 1))!=0) {

        if (ret_code==-1) {
            perror("Error reading");
            return -1;
        }

        printf("Character is: %c, its ascii value: %d\n", ch, ch);
    }
}

Just ignore potential bugs for a moment, since this is not the issue here (I hope). This code will just print each character in the file, and it's ascii value.

Now, watch what happens when I run it on the above files...
Output for config.txt:

Character is: h, its ascii value: 104
Character is: o, its ascii value: 111
Character is: m, its ascii value: 109
Character is: e, its ascii value: 101
Character is: /, its ascii value: 47
Character is: m, its ascii value: 109
Character is: y, its ascii value: 121
Character is: _, its ascii value: 95
Character is: u, its ascii value: 117
Character is: s, its ascii value: 115
Character is: e, its ascii value: 101
Character is: r, its ascii value: 114
Character is: /, its ascii value: 47
Character is: D, its ascii value: 68
Character is: o, its ascii value: 111
Character is: c, its ascii value: 99
Character is: u, its ascii value: 117
Character is: m, its ascii value: 109
Character is: e, its ascii value: 101
Character is: n, its ascii value: 110
Character is: t, its ascii value: 116
Character is: s, its ascii value: 115
Character is: /, its ascii value: 47
Character is: p, its ascii value: 112
Character is: r, its ascii value: 114
Character is: o, its ascii value: 111
Character is: g, its ascii value: 103
Character is: /, its ascii value: 47
Character is: m, its ascii value: 109
Character is: y, its ascii value: 121
Character is: _, its ascii value: 95
Character is: f, its ascii value: 102
Character is: o, its ascii value: 111
Character is: l, its ascii value: 108
Character is: d, its ascii value: 100
Character is: e, its ascii value: 101
Character is: r, its ascii value: 114
, its ascii value: 13
Character is: 
, its ascii value: 10
Character is: h, its ascii value: 104
Character is: o, its ascii value: 111
Character is: m, its ascii value: 109
Character is: e, its ascii value: 101
Character is: /, its ascii value: 47
Character is: m, its ascii value: 109
Character is: y, its ascii value: 121
Character is: _, its ascii value: 95
Character is: u, its ascii value: 117
Character is: s, its ascii value: 115
Character is: e, its ascii value: 101
Character is: r, its ascii value: 114
Character is: /, its ascii value: 47
Character is: D, its ascii value: 68
Character is: o, its ascii value: 111
Character is: c, its ascii value: 99
Character is: u, its ascii value: 117
Character is: m, its ascii value: 109
Character is: e, its ascii value: 101
Character is: n, its ascii value: 110
Character is: t, its ascii value: 116
Character is: s, its ascii value: 115
Character is: /, its ascii value: 47
Character is: p, its ascii value: 112
Character is: r, its ascii value: 114
Character is: o, its ascii value: 111
Character is: g, its ascii value: 103
Character is: /, its ascii value: 47
Character is: I, its ascii value: 73
Character is: O, its ascii value: 79
Character is: /, its ascii value: 47
Character is: i, its ascii value: 105
Character is: n, its ascii value: 110
Character is: p, its ascii value: 112
Character is: u, its ascii value: 117
Character is: t, its ascii value: 116
Character is: _, its ascii value: 95
Character is: f, its ascii value: 102
Character is: o, its ascii value: 111
Character is: r, its ascii value: 114
Character is: _, its ascii value: 95
Character is: p, its ascii value: 112
Character is: r, its ascii value: 114
Character is: o, its ascii value: 111
Character is: g, its ascii value: 103
Character is: ., its ascii value: 46
Character is: t, its ascii value: 116
Character is: x, its ascii value: 120
Character is: t, its ascii value: 116
, its ascii value: 13
Character is: 
, its ascii value: 10
Character is: h, its ascii value: 104
Character is: o, its ascii value: 111
Character is: m, its ascii value: 109
Character is: e, its ascii value: 101
Character is: /, its ascii value: 47
Character is: m, its ascii value: 109
Character is: y, its ascii value: 121
Character is: _, its ascii value: 95
Character is: u, its ascii value: 117
Character is: s, its ascii value: 115
Character is: e, its ascii value: 101
Character is: r, its ascii value: 114
Character is: /, its ascii value: 47
Character is: D, its ascii value: 68
Character is: o, its ascii value: 111
Character is: c, its ascii value: 99
Character is: u, its ascii value: 117
Character is: m, its ascii value: 109
Character is: e, its ascii value: 101
Character is: n, its ascii value: 110
Character is: t, its ascii value: 116
Character is: s, its ascii value: 115
Character is: /, its ascii value: 47
Character is: p, its ascii value: 112
Character is: r, its ascii value: 114
Character is: o, its ascii value: 111
Character is: g, its ascii value: 103
Character is: /, its ascii value: 47
Character is: I, its ascii value: 73
Character is: O, its ascii value: 79
Character is: /, its ascii value: 47
Character is: c, its ascii value: 99
Character is: o, its ascii value: 111
Character is: r, its ascii value: 114
Character is: r, its ascii value: 114
Character is: e, its ascii value: 101
Character is: c, its ascii value: 99
Character is: t, its ascii value: 116
Character is: _, its ascii value: 95
Character is: o, its ascii value: 111
Character is: u, its ascii value: 117
Character is: t, its ascii value: 116
Character is: p, its ascii value: 112
Character is: u, its ascii value: 117
Character is: t, its ascii value: 116
Character is: ., its ascii value: 46
Character is: t, its ascii value: 116
Character is: x, its ascii value: 120
Character is: t, its ascii value: 116
, its ascii value: 13
Character is: 
, its ascii value: 10

Output for test.txt:

Character is: T, its ascii value: 84
Character is: h, its ascii value: 104
Character is: i, its ascii value: 105
Character is: s, its ascii value: 115
Character is:  , its ascii value: 32
Character is: i, its ascii value: 105
Character is: s, its ascii value: 115
Character is:  , its ascii value: 32
Character is: a, its ascii value: 97
Character is:  , its ascii value: 32
Character is: t, its ascii value: 116
Character is: e, its ascii value: 101
Character is: s, its ascii value: 115
Character is: t, its ascii value: 116
Character is:  , its ascii value: 32
Character is: f, its ascii value: 102
Character is: i, its ascii value: 105
Character is: l, its ascii value: 108
Character is: e, its ascii value: 101
Character is: 
, its ascii value: 10
Character is: W, its ascii value: 87
Character is: h, its ascii value: 104
Character is: y, its ascii value: 121
Character is:  , its ascii value: 32
Character is: i, its ascii value: 105
Character is: s, its ascii value: 115
Character is: n, its ascii value: 110
Character is: ', its ascii value: 39
Character is: t, its ascii value: 116
Character is:  , its ascii value: 32
Character is: t, its ascii value: 116
Character is: h, its ascii value: 104
Character is: e, its ascii value: 101
Character is: r, its ascii value: 114
Character is: e, its ascii value: 101
Character is:  , its ascii value: 32
Character is: c, its ascii value: 99
Character is: a, its ascii value: 97
Character is: r, its ascii value: 114
Character is: r, its ascii value: 114
Character is: i, its ascii value: 105
Character is: a, its ascii value: 97
Character is: g, its ascii value: 103
Character is: e, its ascii value: 101
Character is:  , its ascii value: 32
Character is: r, its ascii value: 114
Character is: e, its ascii value: 101
Character is: t, its ascii value: 116
Character is: u, its ascii value: 117
Character is: r, its ascii value: 114
Character is: n, its ascii value: 110
Character is:  , its ascii value: 32
Character is: c, its ascii value: 99
Character is: h, its ascii value: 104
Character is: a, its ascii value: 97
Character is: r, its ascii value: 114
Character is: 
, its ascii value: 10
Character is: a, its ascii value: 97
Character is: t, its ascii value: 116
Character is:  , its ascii value: 32
Character is: t, its ascii value: 116
Character is: h, its ascii value: 104
Character is: e, its ascii value: 101
Character is:  , its ascii value: 32
Character is: e, its ascii value: 101
Character is: n, its ascii value: 110
Character is: d, its ascii value: 100
Character is:  , its ascii value: 32
Character is: o, its ascii value: 111
Character is: f, its ascii value: 102
Character is:  , its ascii value: 32
Character is: e, its ascii value: 101
Character is: a, its ascii value: 97
Character is: c, its ascii value: 99
Character is: h, its ascii value: 104
Character is:  , its ascii value: 32
Character is: l, its ascii value: 108
Character is: i, its ascii value: 105
Character is: n, its ascii value: 110
Character is: e, its ascii value: 101
Character is:  , its ascii value: 32
Character is: i, its ascii value: 105
Character is: n, its ascii value: 110
Character is:  , its ascii value: 32
Character is: t, its ascii value: 116
Character is: h, its ascii value: 104
Character is: i, its ascii value: 105
Character is: s, its ascii value: 115
Character is:  , its ascii value: 32
Character is: f, its ascii value: 102
Character is: i, its ascii value: 105
Character is: l, its ascii value: 108
Character is: e, its ascii value: 101
Character is: ?, its ascii value: 63
Character is: 
, its ascii value: 10

Couple of things that I noticed, and couldn't find an answer for:
First, as the test.txt file suggests, why isn't there '/r' char at the end of each line in this file, while in config.txt there are both '/r' and '/n' at the end of each line??
Second, why did the words "Character is" disappear at the lines where it printed ", its ascii value is 13"??

Thanks.

Was it helpful?

Solution

When printing to a console window (i.e. not a file) the \r instructs it to go back to the beginning of a line (hence your "Character is" text disappears). The \n, however, instructs it to go the next line. The \r is useful for showing progress on the same line, for example.

Files can be saved with either \r\n, \n, or a \r at the end of each line (see comment below), and these days are interpreted the same by text-editors (in fact many warn you if you mix the types within a file). It would appear you have one file with \r\n and the other with just \n in.

OTHER TIPS

End of line differences can be caused by various reasons, e.g. different text editors used.

As for \n and \r characters, they do the following:

  • \n moves the caret to the next line
  • \r moves the caret to the beginning of the current line

With this knowledge you should be able to understand the output of the program. This is 'normal' character:

Character is: t, its ascii value: 116

This is \r, note how caret has been moved to the beginning of the line when it has been printed:

, its ascii value: 13

This is \n, note how caret has been moved to the next line when it has been printed:

Character is: 
, its ascii value: 10

The first question is unsolvable by us, since we don't know how the files were created. Windows programs usually use '\r\n' while for Linux '\n' is enough.

The second question is easy to answer, you print "Character is: \n, its ..." so you get a newline. You can't print a newline without getting one, unless you escape special characters.

edit You may want to escape more then \r & \n, like tabs and others too. See here

The reason "Character is" disappears is that the \13 character is a carriage return. It puts the cursor back to the beginning of the line, so that the rest of the text ", its ascii value is ..." overwrites it.

It is valid to have just \n (new line) or \r\n (carriage return and new line).

I can't answer the differences between the two files because I do not have them in my possession nor do I have a way to create them.

That being said, ASCII Value 13 and ASCII Value 10 are non-printable characters. Meaning, unless you detect and translate the value from what seemingly is an invisible character used to control carriage return and/or line feed to either \r or \n, then you aren't going to "see" it.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top