2015-11-28 7 views
0

У меня возникают следующие трудности. Я пытаюсь прочитать этот файл.Не удается правильно прочитать fscanf

3 
1 2 3 
2 
4 5 

Числа, которые сами по себе размер массива (3 and 2). И следующие числа - это массив. So 3 is the size of (1,2,3) и 2 is the size of (4,5).

Я написал код на C, чтобы читать эти числа и хранить их в массивах, которые используют malloc().

Это мой код:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
main(){ 
    int i=0, j, *size, *vector; 

    size=(int*)malloc(sizeof(int)); 
    vector=(int*)malloc(sizeof(int)); 

    FILE *file; 
    file=fopen("file.dat", "rt"); 

    if (file==NULL){ 
     printf("Exit ..."); 
     exit(1); 
    } 
    else { 
     do{ 
      fscanf(file,"%d",&size[i]); 
      for(j=0;j<=size[i];j++){ 
       fscanf(file,"%d",&vector[j]); 
      } 
      i++; 

     }while(feof(file)==0); 
    } 
    fclose(file); 

return 0; 
} 

читает файл правильно, но если я PRINTF число я получаю:

3 
5 
2 
3 
4 
2 
+0

[Пожалуйста, смотрите эту дискуссию о том, почему не метать возвращаемое значение из 'таНос()' и семьи в 'C'.] (http://stackoverflow.com/q/605845/2173917). –

ответ

1

Две вещи, чтобы упомянуть здесь.

  1. Вы выделили память только для одной переменной через malloc(), но вы пытаетесь получить доступ за пределы выделенной памяти в цикле do...while. Вам необходимо указать realloc(), если потребуется.

  2. Пожалуйста, см Why is “while (!feof (file))” always wrong?

+0

Я могу использовать только 'malloc()'. – Vladimir

+0

@Vladimir, тогда вся цель malloc была бы потеряна, вероятно. Если вы заранее знаете и выделяете требуемый объем памяти, зачем вообще использовать динамическое размещение? –

+0

так как я могу это исправить? – Vladimir

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

int main(void){ 
    int i, j, size, *size_v, **vector; 

    FILE *file; 
    file=fopen("file.dat", "rt"); 

    if (file==NULL){ 
     printf("Exit ..."); 
     exit(1); 
    } 

    i = 0;//scan file 
    while(EOF != fscanf(file, "%d", &size)){ 
     for(j = 0; j < size; j++){ 
      fscanf(file, "%*d"); 
     } 
     i++; 
    } 
    rewind(file); 

    size_v = malloc(i * sizeof(int)); 
    vector = malloc(i * sizeof(int*)); 

    i = 0;//read file 
    while(EOF != fscanf(file, "%d", &size_v[i])){ 
     vector[i] = malloc(size_v[i] * sizeof(int)); 

     for(j = 0; j < size_v[i]; j++){ 
      fscanf(file, "%d", &vector[i][j]); 
     } 
     i++; 
    } 
    fclose(file); 

    //print & deallocate 
    size = i; 
    for(i = 0; i < size; ++i){ 
     printf("%d\n", size_v[i]); 
     for(j = 0; j < size_v[i]; ++j){ 
      printf("%d ", vector[i][j]); 
     } 
     printf("\n"); 
     free(vector[i]); 
    } 
    free(vector); 
    free(size_v); 

    return 0; 
} 

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

int main(void){ 
    int i, j, size, *vector; 

    FILE *file; 
    file=fopen("file.dat", "rt"); 

    if (file==NULL){ 
     printf("Exit ..."); 
     exit(1); 
    } 

    i = 0; 
    while(EOF != fscanf(file, "%d", &size)){ 
     printf("%d\n", size);//each loop 
     vector = malloc(size * sizeof(int)); 
     for(j = 0; j < size; j++){ 
      fscanf(file, "%d", &vector[j]); 
     } 
     for(j = 0; j < size; j++){ 
      printf("%d ", vector[j]); 
     } 
     printf("\n"); 
     free(vector); 
     i++; 
    } 
    fclose(file); 

    return 0; 
} 

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

int main(void){ 
    int i, j, k, size, size_sum, *size_v, *vector; 

    FILE *file; 
    file=fopen("file.dat", "rt"); 

    if (file==NULL){ 
     printf("Exit ..."); 
     exit(1); 
    } 

    i = 0;//scan file 
    size_sum = 0; 
    while(EOF != fscanf(file, "%d", &size)){ 
     size_sum += size; 
     for(j = 0; j < size; j++){ 
      fscanf(file, "%*d"); 
     } 
     i++; 
    } 
    rewind(file); 

    size_v = malloc(i * sizeof(int)); 
    vector = malloc(size_sum * sizeof(int)); 

    i = 0;//read file 
    k = 0; 
    while(EOF != fscanf(file, "%d", &size_v[i])){ 
     for(j = 0; j < size_v[i]; j++){ 
      fscanf(file, "%d", &vector[k++]); 
     } 
     i++; 
    } 
    fclose(file); 

    //print & deallocate 
    size = i; 
    size_sum = 0; 
    for(i = 0; i < size; ++i){ 
     printf("%d\n", size_v[i]); 
     for(j = 0; j < size_v[i]; ++j){ 
      printf("%d ", vector[j + size_sum]); 
     } 
     printf("\n"); 
     size_sum += size_v[i]; 
    } 
    free(vector); 
    free(size_v); 

    return 0; 
} 
Смежные вопросы