Defect Report #130
Submission Date: 03 Dec 93
Submittor: WG14
Source: Sheng Yu
Question
Under subclause 7.9.2 Streams, page 125, lines 26-28:
Data read in from a text stream will necessarily compare equal
to the data that were earlier written out to the stream only if: the
data consist only of printable characters and the control characters
horizontal tab and new-line; ...
Writing on a text stream might not cause characters to be overwritten
exactly one for one, especially on fixed-length record based file
systems. If the file is not truncated beyond the point where the data
is written, there is no sure way to predict what will be read in after
writing in the middle of a text stream because the data might just
replace a character, a line, etc. Consider the following example:
#include <stdio.h>
#include <string.h>
int buf[99];
unsigned int len;
int main()
{
FILE *f = fopen("test data", "w");
fwrite("abc\ndef\n", 8, 1, f);
fseek(f, 0, SEEK_SET);
fwrite("UWXYZ", 5, 1, f);
fseek(f, 0, SEEK_SET);
len = fread(buf, 1, 10, f);
if (len == 8 && !memcmp(buf, "UWXYZef\n"))
; /* Case 1: OK, acts like binary */
else if (len == 5 && !memcmp(buf, "UWXYZ", 5))
; /* Case 2: OK to truncate after write */
else if (len > 5 && !memcmp(buf, "UWXYZ", 5))
printf("len = %u, buf = %s\n", len, buf);
/* Case 3: Is this nonstandard? */
else
printf("This is obviously nonstandard.\n");
}
Can a conforming implemetation translate the above program and produce
the following output (Case 3)?
len = 9, buf = UWXYZdef
Response
Yes, a conforming implementation may produce the ``Case 3''
output. However, there may be cases in some conforming implementations
in addition to those shown in your example, so the printout ``obviously
nonstandard'' may be inappropriate.
Previous Defect Report
< - >
Next Defect Report