[Issue 11432] New: formattedRead and slurp %s format code miss tab as whitespace

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sun Nov 3 09:12:48 PST 2013


http://d.puremagic.com/issues/show_bug.cgi?id=11432

           Summary: formattedRead and slurp %s format code miss tab as
                    whitespace
           Product: D
           Version: D2
          Platform: x86
        OS/Version: Windows
            Status: NEW
          Severity: normal
          Priority: P2
         Component: Phobos
        AssignedTo: nobody at puremagic.com
        ReportedBy: bearophile_hugs at eml.cc


--- Comment #0 from bearophile_hugs at eml.cc 2013-11-03 09:12:46 PST ---
This is a C program, note the string s that contains three fields, each
separated by a single tab:


#include <stdio.h>
#include <stdlib.h>
int main() {
    char* s = "red\t10\t20";
    char t[20];
    int a, b;
    sscanf(s, "%s %d %d", &t, &a, &b);
    printf(">%s<>%d<>%d<\n", t, a, b);
    return 0;
}


It prints the output I expect:
>red<>10<>20<



The syntax of scanf says regarding the %s code:
http://www.mkssoftware.com/docs/man3/scanf.3.asp


s
A character string is expected; the corresponding argument should be a
character pointer pointing to an array of characters large enough to accept the
string and a terminating \0, which is added automatically. A white-space
character terminates the input field. The conversion specifier hS is
equivalent.



I think this is a similar D program:


import std.format, std.stdio;
void main() {
    string s = "red\t10\t20";
    string t;
    int a, b;
    formattedRead(s, "%s %d %d", &t, &a, &b);
    writef(">%s<>%d<>%d<\n", t, a, b);
}


But it prints:

>red    10  20<>0<>0<

As you see the tab is considered part of the first string field. This causes me
troubles when I use slurp as shown below.

If I have this "data.txt" text file with Unix-style newlines, and where the
string is separated by the integer with just 1 tab character:


red 10
blue    20


(So the whole file is:  "red\t10\nblue\t20").


If I run this code:

import std.file: slurp;
void main() {
    slurp!(string, int)("data.txt", "%s %d");
}


I get a stacktrace (dmd 2.064beta4):

std.conv.ConvException at ...\dmd2\src\phobos\std\conv.d(2009): Unexpected end of
input when converting from type char[] to type int
--------
0x0040E269 in pure @safe int std.conv.parse!(int, char[]).parse(ref char[]) at
C:\dmd2\src\phobos\std\conv.d(2010)
...


To avoid the stack trace I have to put a tab between the two formattings:

import std.file: slurp;
void main() {
    slurp!(string, int)("data.txt", "%s\t%d");
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list