2013-06-12 2 views
0

Я пытаюсь создать программу, которая будет считывать данные из нескольких текстовых файлов и сравнивать данные из каждого файла. В настоящее время я застреваю, пытаясь прочитать из файла с неизвестным количеством столбцов и строк, пока пользователь не определит длину во время выполнения.Чтение данных указанной пользователем длины в C

В прошлом я использовал fscanf, но он всегда имел количество столбцов и какую переменную они были жестко подключены к программе, то есть fscanf(fp,"%d %d %d",&a,&b,&c). Можно ли что-то использовать, чтобы я не мог по своей сути программировать в код, скажем, 3 двойных индикатора? В настоящее время у меня есть это, поэтому пользователь вводит количество файлов, столбцов в каждом файле и строках. Идея программы заключается в том, чтобы всегда сравнивать похожие файлы, поэтому они должны всегда иметь один и тот же формат, то есть количество строк и количество столбцов.

Текущий код, если это помогает:

int main(){ 
/* Ask for # of files */ 
printf("\nHow many files are you comparing\n"); 
int filnum; 
scanf("%d",&filnum); 

/* Ask for # of columns */ 
printf("How many columns of data are there?\n"); 
int colnum; 
scanf("%d",&colnum); 

/* Ask for length of rows */ 
printf("How many rows of data are there?\n"); 
int rownum; 
scanf("%d",&rownum); 

/* Read in file names */ 
char filea[filnum][50]; 
int i; 
for (i=0; i<filnum; i++) { 
    char temp[50]; 
    printf("Eneter file #%d please.\n",i+1); 
    scanf("%s",temp); 
    if(strlen(temp)>50){ 
     printf("Please shorten file to less than 50 char"); 
     exit(0); 
    } 
    strcpy(filea[i],temp); 
} 

/* Create data array on heap */ 
double* data = (double*)malloc(sizeof(double)*rownum*colnum*filnum); 

/* Start opening files and reading in data */ 
for (i=0; i<filnum; i++) { 
    FILE *fp; 
    fp = fopen(filea[i],"r"); 
    if (fp==NULL) { 
     printf("Failed to open file #%d",i+1); 
     exit(1); 
    } 
    /* Attempt */ 
    int j,k; 
    for (j=0; j<rownum; j++) { 
     for (k=0; k<colnum; k++) { 
      fscanf(fp," %lf",&data[i*rownum*colnum + j*colnum + k]); 
      printf("%lf, ",data[i*rownum*colnum + j*colnum + k]); 
     } 
     printf("\n"); 
    } 

    fclose(fp); 
} 

free(data); 


return 0; 
} 

Extra удивительным будет каким-то образом избавиться от необходимости eneter # столбцов и # строк, но это забегаю вперед, я думаю. Спасибо за любую помощь, которую вы, ребята, можете предложить.

ответ

1

Может быть:

for (i=0; i<max; i++) 
{ 
    fscanf (fp, " %f", &var[i]) 
} 

Вы должны выделить var длину, по меньшей мере max с типом double из float

Или прочитать всю строку с fgets затем использовать strtok и strtod, чтобы получить плавающие номера точек.

+0

Спасибо, это сработало! –

Смежные вопросы