2012-06-09 4 views
0

При записи значений в файл в C под Windows я получаю то, что кажется неправильным, и результат отличается от той же программы, что и в Cygwin.write() не записывает правильное количество байтов в окнах в C

В этом случае, я пишу поплавок в файл:

#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <io.h> 

int   main(void) 
{ 
    int  fd; 
    float f; 

    fd = open("file.a", O_RDWR | O_CREAT); 
    f = (float)atof("-0.1352237"); 
    printf("%.7f\n", f); 

    write(fd, (void *)&f, sizeof(float)); 
    close(fd); 
    printf("sizeof(float): %d\n", sizeof(float)); 

    return (EXIT_SUCCESS); 
} 

я составил и запустить этот файл как на Windows, так и в Cygwin (без включаемые), и я не получив тот же результат. Поскольку я пишу поплавок, я бы ожидать, что выходной файл имеет 4 байта, написанные для него

Однако, выход при компиляции cl.exe в командной строке, кажется неправильным:

1578 0d0a be 

Если я прочитаю из файла в поплавок, я не получу правильное значение, очевидно. И количество байтов, записанных в файл неправильно, это должно быть только 4 байта, а не 5.

Это то, что я получаю, когда работает в Cygwin:

1578 0abe 

Это правильно. Если я прочитаю это из файла в поплавок, я получу правильное значение (-0.1352237).

Я что-то упустил? Ошибочны ли реализации этих функций в окнах? Или, может быть, я не правильно записываю данные?

ответ

2

Вы открыли файл в текстовом режиме (по умолчанию), так что 0a ("\n") переводится на 0d0a ("\r\n").

Вам необходимо открыть файл в двоичном режиме, используя флаг O_BINARY.

+0

Какая основная ошибка! Спасибо, что исправляет проблему и имеет смысл. Но почему это написано? и он записывается между двумя байтами. – dotminic

+2

Поскольку значение ASCII для '\ n' равно' 0a' (т. Е. 10 в десятичной системе). У одного из ваших байтов есть это значение. –

+0

Хорошо, имеет смысл, я вижу, что я делаю неправильно. Благодарю. – dotminic

Смежные вопросы