C программирование с использованием файлов и структур - PullRequest
0 голосов
/ 11 января 2011

как прочитать отрицательное число из файла с помощью fgetc?

Ответы [ 7 ]

4 голосов
/ 11 января 2011

fgetc читает только один символ за раз. Если вы пытаетесь прочитать отрицательное число из файла или любого другого числа, используйте fscanf.

#include <stdio.h>

main()
{
  int v;
  fscanf (stdin, "%d", &v);
  printf ("v = %d\n", v);
}
1 голос
/ 11 января 2011

Если «структуры» в заголовке подразумевают двоичный код, то вы, вероятно, захотите использовать fread (), но если вы действительно гоняетесь за вопросом о том, какова структура целого числа, хранящегося в двоичном файле, вы можете использовать fgetc ().

Этот код показывает, как использовать объединение, чтобы отобразить последовательность прочитанных байтов обратно в целое число.

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

union Integer
{
    int intPart_;
    char charPart_[4];
};


int main(int argc, char* argv[])
{
    FILE* pFile = fopen("integerFile.dat", "w");

    int intWritten = -257;
    size_t bytesWritten = fwrite(&intWritten, 1, sizeof(int), pFile);
    assert(bytesWritten == sizeof(int));
    fclose(pFile);

    pFile = fopen("integerFile.dat", "r");
    int intRead = 0;
    size_t bytesRead = fread(&intRead, 1, sizeof(int), pFile);
    assert(bytesRead == sizeof(int));
    printf("%d\n", intRead);
    fclose(pFile);

    pFile = fopen("integerFile.dat", "r");
    Integer intToRead;
    for(int i = 0;
        i != sizeof(int);
        ++i)
    {
        int byteRead = fgetc(pFile);
        intToRead.charPart_[i] = byteRead;
        printf("%d\n", byteRead );
    }
    printf("%d\n", intToRead.intPart_);


    fclose(pFile);


    return 0;
}
0 голосов
/ 11 января 2011

Без проверки over / underflow вы можете использовать fscanf WITH проверку возвращаемого значения:

#include <stdio.h>

int main()
{
  int v;
  if( 1==fscanf(yourfilepointer, "%d", &v) )
    printf ("v = %d\n", v);
  else
    fputs("error on reading v",stderr);
  return 0;
}
0 голосов
/ 11 января 2011

Я согласен с Чарли в том, что есть гораздо лучшие способы сделать это, чем при использовании нескольких вызовов fgetc, но если вы настаиваете на использовании этой функции, вам нужно будет выполнить цикл, который оценивает каждый символ,Это также зависит от того, как данные закодированы.Если это ascii (как подразумевает использование func, который возвращает char), вы должны проверить, является ли первый символ "-", а затем преобразовать каждый последующий char в int с atoi (const char *) по одному, и умножитьваше значение результата на десять каждой итерации, прежде чем добавить новое значение к нему.Лучшим способом было бы прочитать несколько символов (используя fgets или что-то еще), а затем преобразовать символ * с помощью atoi (const char *).Возможно, если бы вы описали более четко, что вы пытаетесь сделать, можно было бы получить лучший ответ.Помните, что использование fscanf не удастся, если ваши данные отформатированы не так, как вы указали.Но fscanf - действительно ваш ответ на эту проблему.

0 голосов
/ 11 января 2011

«0» имеет значение ascii 0x30, «1» равно 0x31 ... и до сих пор ... Предполагая, что у вас есть только один номер в вашем файле:

   FILE * pFile;
   int c, n = 0;
   bool negative;
   pFile=fopen ("myfile.txt","r");
   if (pFile==NULL){
      perror("Error opening file");
   }else{
        c = fgetc (pFile);
        negative = (c == '-');
        do {
          c = fgetc (pFile);
          if (c>=0x30 && c<=0x39) {
         n = n*10 + (c-0x30);
       }
        } while (c != EOF);
        fclose (pFile);
   }
   if(negative==true) n=n*-1;
   printf ("Your number: %d\n",n);
0 голосов
/ 11 января 2011

fgetc () интерпретирует символ как «беззнаковый символ», но преобразует его в int (но возвращает EOF, равный -1, в конце файла).

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

0 голосов
/ 11 января 2011

Как закодировано число?

Если это ASCII, помните, что оно занимает более одного символа.Вы можете написать цикл для него, но вы можете найти fscanf дополнительную справку.

Если это двоичные данные, помните, что fgetc все равно будет читать только 8 бит - опять же, вам нужно подумать одругие функции, чтобы сделать это эффективно.

Дело здесь в том, что если вы не делаете это просто, чтобы доказать, что может , fgetc, вероятно, неправильный ответ.Может быть fgets?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...