Конец ФАЙЛА* указатель не равен размеру записанных данных

TL; DR: Ваши вложенные ifs не учитываются полностью для условия else. Вам нужно правильно использовать and (&&) и or (||)

Я думаю, у вас есть небольшое недопонимание того, как работают if и else. Ваша проблема заключается в том, что вы не используете and и or.

Это утверждение:

 if(die[0] == die[1]){
    if(die[1] == die[2])
        pts += 1500;
 }
 else if((die[0] + 1) == die[1]){
    // do smth
 }

Не будет входить в другое, если первое утверждение if истинно, оно также не войдет в else, независимо от того, какое второе предложение if делает.

То, что вы хотите, это:

if(die[0] == die[1] && die[1] == die[2]) {
    pts += 1500;
else if ...

Разница здесь в том, что все условия первого условия должны применяться, если только одно из условий не выполняется, остальные будут выполнены. Ваш собственный код будет переходить к другому, только если первое условие не выполнено, второе больше не учитывается, так как это еще одна конструкция if в новой области видимости первого if. else всегда относится только к if, которому он соответствует, а не к следующему if в рамках первого if.

8
задан paxdiablo 6 November 2010 в 12:05
поделиться

4 ответа

Так как Вы открываете файл в текстовом режиме, он преобразует маркеры конца строки, такие как LF, в CR/LF.

Это вероятно, если Вы работаете на Windows (и Вы, вероятно, учитывая, что Ваше имя файла запускается с "c:\").

Если Вы открываете файл в "wb" режим, я подозреваю, что Вы найдете, что числа идентичны:

FILE* test = fopen("C:\\core.u", "wb");

Стандарт C99 говорит следующее в 7.19.5.3 The fopen function:

Режим аргумента указывает на строку. Если строка является одним из следующих, файл открыт в обозначенном режиме. Иначе поведение не определено.

r открытый текстовый файл для чтения
w усеките, чтобы обнулить длину или создать текстовый файл для записи
a добавьте; откройте или создайте текстовый файл для записи в конце
rb открытый двоичный файл для чтения
wb усеките, чтобы обнулить длину или создать двоичный файл для записи
ab добавьте; откройте или создайте двоичный файл для записи в конце
r+ открытый текстовый файл для обновления (чтение и запись)
w+ усеките, чтобы обнулить длину или создать текстовый файл для обновления
a+ добавьте; откройте или создайте текстовый файл для обновления, пишущего в конце
r+b или rb+ открытый двоичный файл для обновления (чтение и запись)
w+b или wb+ усеките, чтобы обнулить длину или создать двоичный файл для обновления
a+b или ab+ добавьте; откройте или создайте двоичный файл для обновления, пишущего в конце

Вы видите, что они различают w и wb. Я не полагаю, что реализация требуется, чтобы рассматривать два по-другому, но обычно более безопасно использовать режим двоичного счета для двоичных данных.

19
ответ дан 5 December 2019 в 08:55
поделиться

filepointer является cookie. Это не имеет никакого значения. Единственная вещь, для которой можно использовать его, состоит в том, чтобы искать на то же место в файле. Я даже не уверен, гарантирует ли ISO C, что ftell возвращает увеличивающиеся значения. Если Вы не верите этому, посмотрите на различное, ищут () режимы. Они существуют точно, потому что положение не является простым байтовым смещением.

0
ответ дан 5 December 2019 в 08:55
поделиться

что возвращает fwrite? обычно возвращаемое значение должно быть числом записанных байтов. Кроме того, что делает ftell (), отвечают прямо перед fseek?

Это могло бы помочь знать что операционная система, версия компилятора C и библиотека C.

0
ответ дан 5 December 2019 в 08:55
поделиться

windows на самом деле не записывает все данные в файл без flush и, возможно, fsync. Возможно, поэтому

0
ответ дан 5 December 2019 в 08:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: