2017-02-02 1 views
0

Что происходит, когда я пишу (через fputc) значение больше 255 в файл?fputc и fgetc (в C) для значений больше 255?

Вот мой код:

inputFile = fopen("arx.txt", "wr"); 
int a = 253; 
for (int i = 0; i < 5; i++) { 
    printf("writing %d\n", a); 
    fputc(a++, inputFile); 
} 
int b = 2 * 253; 
for (int i = 0; i < 5; i++) { 
    printf("writing %d\n", b); 
    fputc(b++, inputFile); 
} 

и вот что я вижу в файле

ύώ ϊϋόύώ

мне нужно записать эти значения в массивы вместо файлов, и я должен знать, что происходит внутри fputc и fgetc.

Любая помощь?

+3

Документация для чтения помогает. Из ['man fputc'] (https://linux.die.net/man/3/fputc): * fputc() записывает символ c, **, переданный в неподписанный символ **, в поток. * –

+0

' «wr» 'не является строкой стандартного режима для' fopen() '. – chqrlie

+0

Возможно, это может пригодиться вам: http://www.cprogramming.com/tutorial/unicode.html При работе со значениями> 255 вы находитесь вне диапазона символа unsigned. Таким образом, вам нужно будет работать со значениями не как символы, а как некоторые более крупные типы данных, такие как шорты или ints. Конечно, для этого вам придется избегать нормальных функций обработки символов, потому что многие из них будут несовместимы с этими большими значениями. – SpencerD

ответ

3

Функция fputc записывает в выходной поток преобразованный в тип unsigned char свой аргумент.

Поскольку функция возвращает символ он написал вы можете легко проверить, какой характер был написан

Рассмотрим следующий пример показательной программы

#include <stdio.h> 

int main(void) 
{ 
    int c1 = 257; 

    int c2 = fputc(c1, stdout); 

    printf("c2 = %d\n", c2); 

    return 0; 
} 

Его выход

c2 = 1 

Примите во внимание, что вы указали неправильный режим открытия функции "wr". В этом случае поведение не определено. Просто используйте "w".

+0

Я нахожу Стандарт слегка неоднозначным в этой точке. C11 §7.21.5.3 3 говорит, что это неопределенное поведение, но в следующей сноске говорится: «Если строка начинается с одной из приведенных выше последовательностей, реализация может предпочесть игнорировать остальные символы ...» GCC, похоже, следует этому дорожка. Должны ли мы называть это неопределенное поведение или поведение, определяемое реализацией? –

+0

@DavidBowling Примечания AFAIK не являются нормативными. –

+0

Я полагаю, что это имеет смысл. Поэтому его следует называть UB, согласно стандарту. Но может ли GCC не соответствовать здесь? Должен признаться, я нахожу эти разногласия в нескольких словах немного запутанными. –

2

fputc() записывает байты в выходной поток. Его первый аргумент, int, перед записью в файл преобразуется в unsigned char. В системе с 8-битовых байтов, то файл будет содержать это (шестнадцатеричный дамп):

00000000 fd fe ff 00 01 fa fb fc fd fe      ýþÿ..úûüýþ 

Как это содержимое отображается на вашей системе полностью зависит от инструмента и окружающей среды вы используете для увидеть.

Вы не можете выводить коды кода Unicode за пределы диапазона unsigned char в файл с fputc(), вы должны закодировать их способом, совместимым с вашей системой. Вы можете использовать общую кодировку UTF-8, которая сегодня широко используется, или что-то более конкретное для вашей области. Возможно, вы сможете настроить свой язык и использовать широкие функции ввода-вывода символов, задокументированные в стандарте C и определенные в <wchar.h>: fwide(), getwc() и putwc().