2015-02-27 2 views
0

У меня есть одна странная проблема при использовании fwrite() в C. После редактирования файла целыми числами я получаю нуль («0») перед моим последним элементом, который добавлен fwrite(). состоит в том, чтобы разделить целые числа в файле на группы, которые состоят из 10 элементов или меньше.fwrite() puts unknown zero

Например, у меня есть: {2, 3, 9, 4, 6, 7, 5, 87, 65,12, 45, 2, 3, 4, 5, 6, 7, 8, 9}

после редактирования мне нужно: {2, 3, 9, 4, 6, 7, 5, 87, 65, 12, 87, 45, 2, 3, 4, 5, 6, 7, 8, 9, 45 };

С кодом ниже я получаю: {2, 3, 9, 4, 6, 7, 5, 87, 65, 12, 87, 45, 2, 3, 4, 5, 6, 7, 8, 9, 0, 45 }; В процессе шаг за шагом отладки FWRITE() работает только два раза, он пропустил 87 после первых десяти элементов и 45 после того, как остался. Zero не был вызван fwrite(). Это так? С чего это происходит?

Мой код:

while (!feof(fp)) { 

     fread(&elems[k], sizeof(int), 1, fp); 
     fwrite(&elems[k], sizeof(int), 1, hp); 
     ++k; 

     if (k == 10 || feof(fp)){ 
      for (i = 0; i < 10; ++i){ 
       if (elems[i] > max_number){ 
        max_number = elems[i]; 
       } 
      } 
      fwrite(&max_number, sizeof(int), 1, hp); 
      for (i = 0; i < 10; ++i){ 
       elems[i] = 0; 
      } 
      max_number = INT_MIN; 
      k = 0; 
     } 

    } 

Спасибо за ответы!

+0

Почти всегда неправильно использовать 'feof'. Я попытаюсь найти один из дубликатов, чтобы отметить это через несколько минут. –

+2

Возможный дубликат ["while (! Feof (file))" всегда неверен "(http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong) –

+0

@ user3386109: Но он похоже, не читает и не пишет в тот же поток. fp vs hp обрабатывает файлы. –

ответ

1
  • Использование feof приведет к чтению дополнительного элемента.
  • Необходимо проверить наличие ошибок с fwrite и fread звонков.
    • Возможна одна ошибка EOF.
    • Если fread возвращает 0 пунктов, прочитанное значение будет оставлено на все, что было до этого. Вероятно, 0. Вероятно, из-за вашего дополнительного 0.
+0

Хорошо, я понимаю. И как мне удалить лишний «0»? Могу ли я проверить его после последнего fread и сразу же вырезать, если он появится? Но что, если в моем файле один из целых чисел равен нулю? Эта простая задача кажется слишком проблематичным в c. –