2016-02-26 2 views
0

Моя цель - прочитать в txt-файле (small_ramp.txt), а затем ввести все числа, исключающие первый в массив. В файле есть 11 строк чисел на нем, число 10 в первой строке указывает количество чисел в файле, а затем следующие 10 чисел (1-10) Small_ramp.txt. Когда в командной строке я вхожу в Stats.exe < small_ramp.txt при выполнении этой команды I Error получает это сообщение об ошибке.C Как читать в файле из командной строки args

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

int main(int argc, char* argv[]) 
{ 
    int n, i; 
    FILE* fpointer; 
    double *arr; 

    fpointer = fopen(argv[1], "r"); 

    if (argc != 2) { 
     printf("ERROR: you must specify file name!\n"); 
     return 1; 
    } 

    if (!fpointer) { 
     perror("File open error!\n"); 
     return 1; 
    } 

    fscanf(fpointer, "%d", n);// Scan first line of small_ramp.txt to find array size 
    arr = (double*)malloc(sizeof(double) * n);// allocate memory for array with the size given (n) 

    while (!feof(fpointer)) { 
     fscanf(fpointer, "%lf", arr + 1); 
    } 

    for (int i = 0; i < n; ++i) 
    { 
     printf("%lf,", arr[i]); 
    } 

    fclose(fpointer); 
    return 0; 
} 

Я предполагаю, что мой вопрос я читал в файл правильно, и если так может кто-то мне точку в правильном направлении для исправления этой ошибки?

+4

'Stats.exe small_ramp.txt' вместо' Stats.exe BLUEPIXY

+1

также 'в то время как { fscanf (fpointer, "% LF", обр + 1) (feof (fpointer)!); } '->' for (i = 0; i BLUEPIXY

+0

@JafferWilson Этот вопрос был у него имя файла, установленное на argv [0] вместо 1 – Maxium

ответ

1
  • Вы должны проверить количество аргументов перед тем использованием argv[1].
  • Передача данных, имеющих неправильный тип, на fscanf() вызывает undefined поведение. Используйте вместо .
  • Вы читаете данные только arr[1]. Следовательно, arr[0] имеет неопределенное значение и с использованием значения вызывает неопределенное поведение.
  • %f следует использовать вместо %lf для печати double значение через printf().

Примечание: говорят you shouldn't cast the result of malloc() in C.

+1

'% lf' является избыточным, но это не вредно. – Schwern

+0

Могу ли я спросить, почему я только читаю данные в arr [1]? не будет иметь позицию по умолчанию при arr [0]? также мой цикл while должен читать данные из всего файла, что означает, что arr будет увеличиваться на 1 каждый раз. – Maxium

+0

вы делаете: fscanf (fpointer, "% lf", arr + 1) ;. arr + 1 является эквивалентом arr [1]. Вы не используете ничего для индексации по всему массиву. Кроме того, ваш код дополнительно ошибочен, чтобы доверять количеству аргументов, найденных в заголовке файла. Вы должны проверить, выглядит ли номер в здравом смысле, прочитайте это количество записей и ошибки, если конец файла не был достигнут. –