2014-11-28 2 views
0

У меня есть программа, которая много раз определяет значение int, fc1, в цикле for и выводит его в файл с помощью fprintf.fprintf печать странных символов в цикле for

for (i=0; i<80; i++) 
{ 
    fc1 = somefunction(); // this function determines if fc is 0 or 1 

    // printing fc1 to stdout 
    printf("%d\n", fc1); 

    // printing output to file 
    fprintf(out, "%d ", fc1); 
} 

Всякий раз, когда я бегу Петля в 80 раз или меньше, то выходной файл, как ожидалось:

1 0 1 0 1 1 0 0 0 0 1 0 1 1 1 1 0 0 0 1 1 0 1 1 1 0 1 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 

Однако, как только я кольцую 81 раз или более, выходной файл мусор ..

‱‰‱‰‱‱‰‰‰‰‱‰‱‱‱‱‰‰‰‱‱‰‱‱‱‰‱‰‰‱‱‱‰‰‱‰‰‱‰‱‰‱‰‱‱‰‱‱‰‰‰‱‰‱‰‱‰‰‱‱‰‰‱‰‰‰‰‰‰‱‱‱‰‱‰‱‰‱‰‰‱ 

как-то закончит вывод U + 2030 и U + 2031, хотя я печатал целое число.

Когда я пытаюсь

fprintf(out, "%d", fc1); 
fputc(' ', out); // i changed the fprintf to fprintf the int and fputc the space 

ничего не меняется тоже, эта проблема все еще происходит, но когда я делаю

fprintf(out, "%d", fc1); 
fputc(' ', out); 
fputc(' ', out); 

как-то это работает! и выход будет иметь 2 пробела,

1 0 1 0 1 1 0 0 0 0 1 0 1 1 1 1 0 0 0 1 1 0 1 1 1 0 1 0 0 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 1 1 0 0 0 1 0 1 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 0 1 

Может кто-нибудь сказать мне, что не так с моим использованием fprintf?

Некоторые дополнительная информация

  • Все переменные INT
  • указатель файла устанавливается правильно
  • fc1, безусловно, имеет 1 или 0 каждый раз, когда проходит цикл (потому что я напечатает значение на стандартный вывод и я могу видеть его 0 или 1)
  • GNU GCC компилятор, MingW CodeBlocks 12,11 на Windows 7

EDIT:

вот SomeFunction()

int fc(int a, int b, int c, int d, int e) 
{ 
    int bits = a*10000+b*1000+c*100+d*10+e; 
    switch(bits) 
    { 
     case 0: 
     case 1: 
     case 100: 
     case 101: 
     case 111: 
     case 1000: 
     case 1001: 
     case 1110: 
     case 1111: 
     case 10000: 
     case 10001: 
     case 10010: 
     case 10100: 
     case 10110: 
     case 11010: 
     case 11110: 
      return 1; 
      break; 
     default: 
      return 0; 
      break; 
    } 
} 

и способ открыть указатель на файл из

FILE *out = fopen("out.txt", "w"); 

открыть выходной файл с помощью блокнота на окнах

+1

Сообщение 'somefunction' или все, что мы можем сделать, это угадать. Несомненно, вы либо переполняете размер хранилища, либо массив в своем цикле. Вы можете циклически и распечатывать все значения с помощью '% d' между« 2147483648 - 2147483647 »с int и никогда не иметь никаких проблем, но как только вы заставляете ваш int превышать' выше/ниже', вы либо переполнились, либо отклонились 'undefined behavior', если вы не справитесь с этим. –

+1

Можете ли вы показать, как открыть файл 'out'? Какие флаги вы используете? Кроме того, какое программное обеспечение вы используете для чтения файла 'out'? Поддерживает ли он кодировку UTF-8? – SSC

+0

, если вы открываете этот файл с помощью блокнота ++ или что-то, что они могут вывести из кодирования, что вызывает вашу проблему. попробуйте заставить просмотр в iso-8859-1 или ASCII ... –

ответ

3

Взгляните на таблицу ASCII, особенно записи для

  1. пространство: 0x20
  2. «0»: 0x30
  3. «1»: 0x31

Ваша программа, кажется, делает все правильно, но ваш зритель слишком умный, чтобы оставить хорошо достаточно в одиночку ,
Я действительно ненавижу программы, будучи настолько умными, что они делают что-то совершенно идиотское.
(как угадать простой ASCII-файл является UTF-16)

Тем не менее, есть надежда: Либо вы можете заставить свой зритель использовать определенную кодировку при открытии или во время просмотра, или вы можете просто переключиться на другой один.

BTW: Блокнот в окнах использует эвристическую функцию черного ящика IsTextUnicode для божественного текста в формате Юникод или нет.

+0

Привет! Означает ли это, что на самом деле проблем нет? Как заставить блокнот просматривать его так, как я его хочу? И если я сделаю fscanf (в, «% d», и somevar), смогу ли я правильно их прочитать и нули? – Christopher

+0

Блокнот? Хорошо, просто выберите open и выберите подходящую кодировку в комбинированном поле внизу (ANSI/ASCII/ISO-независимо/OEM должны работать). – Deduplicator

+0

Вы были правы! Спасибо! – Christopher

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