Как преобразовать значения, которые я получаю из файла (char) и сохранить значения в массиве double?

Я читаю данные из файла, получаю, сколько столбцов и строк у меня есть (файл данных), пока что все. Теперь я пытаюсь прочитать значения одно за другим и сохранить значения в двумерном массиве (double). Я получаю значения как char, используя getc, но когда я пытаюсь использовать atoi или atof для преобразования значений из char в double, я получаю странные значения.

double ther[j][number];
char c;
int tim=0,nther=0;


FILE *fp3 = fopen("data.txt", "r");
c = getc(fp3) ;

while (c!= EOF)
{ 

    ther[tim][nther]=atoi(&c);
    printf("%lf", ther[tim][nther]);


    nther++;
    c = getc(fp3);

    if(nther==number)
    {
        tim++;
        nther=0;
    }
    tim=0;
}

fclose(fp3);

Любое предложение?... (я продолжаю искать). Извините, у меня есть файл data.txt, и в этом файле есть строки и столбцы чисел:

1 2 3 4 5

6 7 8 9 10

Поэтому мне нужно сохранить данные в двумерном массиве: благодаря ответам у меня появилось несколько идей: использовать строку, затем разделить все значения и сохранить каждое из них. 1-я строка - строка-> массив [0][0], массив [0][1] и т. Д. Затем перейдите к другой строке и сделайте то же самое.

До сих пор я получаю некоторые числовые значения, но ни одно из них не хранится в data.txt.

3 ответа

Решение
#include <stdio.h>

int main(){
    int j = 2;
    int number = 5;

    double ther[j][number];
    double d;
    int tim=0,nther=0;
    FILE *fp3 = fopen("data.txt", "r");

    while (fscanf(fp3, "%lf", &d)==1){
        ther[tim][nther]=d;
        printf("%g ", ther[tim][nther++]);

        if(nther==number){
            ++tim;
            nther=0;
            printf("\n");
        }
    }
{
    int r, c;
    for(r=0;r<tim;++r){
        for(c=0;c<number;++c){
            printf("%f ", ther[r][c]);
        }
        printf("\n");
    }
}
    return 0;
}

Вы можете прочитать двойной из файла, используя fscanf. Примером может быть:

double d;
fscanf("%f", &d);

fscanf может сделать гораздо больше, поэтому я рекомендую проверить документацию.

Метод, который вы используете, получает один символ (как указал Мэтт МакНабб - неправильно). Символ является 1 байтом и может хранить значения 0-255. Вы читаете в текстовом режиме, поскольку вы не указываете режим с помощью fopen (обычно рекомендуется явно запрашивать двоичный режим "rb/wb" или текстовый "rt/wt"). Это означает, что вы читаете значение ASCII одной цифры.

Допустим, файл содержит:

7.2, 3.0, 1.0

Первый звонок getc(fp3) получит символ "7", который будет иметь значение 55 для ASCII. Очевидно, это не даст вам того, что вы ищете.

Вместо этого вы можете использовать:

double d[3];
fscanf("%f, %f, %f" &d[0], &d[1], &d[2]);

Что бы получить три значения с плавающей точкой в ​​файле.

Во-первых, это должно быть int c;, getc() Функция должна иметь возможность возвращать другое значение для всех возможных charс, а также другое значение EOF (что означает конец файла или ошибку потока).

Если вы используете char c;, то вы должны в конечном итоге EOF конвертируется в значение юридического характера, поэтому вы не можете определить разницу между этими двумя случаями. Другими словами, ваш код может вести себя как EOF когда на самом деле это просто ударил этот конкретный персонаж.

Двигаясь дальше, atoi(&c) не является правильным. Если вы читаете документацию для atoi Функция - это всегда хорошая идея при использовании функций - вы обнаружите, что она ожидает строку в качестве ввода. Тем не мение, &c это не строка Это адрес одного символа.

Итак, ваши варианты:

  • создать строку и передать ее atoi
  • не использовать atoi

Вы не сказали, чего ожидали; но если вы хотите преобразовать символ, который вы прочитали в '3' быть целым числом 3 тогда вы можете написать: ther[tim][nther] = c - '0';,

Однако у вас также должен быть некоторый код для обработки случаев, когда вы читаете что-то, что не является числом.

Если вы хотите читать более одного символа за раз (например, "31" -> 31затем подход getc не подходит - вам нужно переключиться на использование функции, которая читает несколько символов одновременно, например, fscanf или же fgets,

Наконец, вы установили tim в 0 каждая итерация цикла, поэтому tim++ никогда не имеет длительного эффекта, может быть, это был недосмотр.

Другие вопросы по тегам