данные из printf записываются в файл при использовании в качестве аргумента write () - PullRequest
0 голосов
/ 03 ноября 2019

Я написал этот фрагмент, чтобы записать некоторые данные в некоторый файл:

//CODE 1
int retval=open("hello.txt",O_WRONLY|O_CREAT|S_IRUSR);
int len=6;

if(retval<0)
{
    printf("wrong\n");
}
else
    printf("abcd %ld",write(retval,"hello",len));

Теперь я заметил, что abcd из printf также записывается в файл, если я увеличиваю значениеlen (скажем, len=9):

//CODE 2 with value of len=9
int retval;

while((retval=getchar())!=EOF)
{
    if(retval!='\0')
        printf("%c",retval);
    else
    {
        printf("\n\nfound null-termination\n\n");
    }
}

вывод для второго кода:

//value of len is 9 in this case
hello

found null-termination

abc

Теперь я не могу понять, как abcd из printfтакже вставляется в файл - это потому, что данные в printf не ждут, пока данные в исходящем потоке будут сброшены в файл (сначала вставляется write()), следовательно, оба файла записываются в файл

1 Ответ

1 голос
/ 03 ноября 2019

Что у вас есть неопределенное поведение ! В частности, при вызове write вы задаете в качестве второго аргумента строковый литерал длины 5, но сообщаете, что в третьем аргументе есть 9 байтов.

В вашем случае я предполагаю, что компилятор помещает данные abcd %ld (также строковый литерал) в память сразу после данных hello, поэтому он записывает abcd.

Между прочим, на это не следует полагаться! Это полностью зависит от компилятора, как он размещает такие строковые литеральные данные в памяти. Программист должен убедиться, что аргумент "size" для write является действительным - ваше значение 9 равно , а не допустимо, следовательно, undefinedповедение .

PS: вызов write будет выполнен до того, как будет вызвана функция printf - это , а не undefined.

...