【问题标题】:Can't read properly with fscanf无法使用 fscanf 正确读取
【发布时间】:2015-11-28 13:27:48
【问题描述】:

我有以下困难。我正在尝试读取此文件。

3
1 2 3
2
4 5

单独的数字是数组(3 and 2) 的大小。以下数字是数组。 所以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

【问题讨论】:

标签: c arrays malloc scanf


【解决方案1】:

这里要提两件事。

  1. 您仅通过malloc() 为一个变量分配了内存,但您尝试访问do...while 循环中分配的内存之外的内存。您需要在需要时realloc()

  2. 请看Why is “while ( !feof (file) )” always wrong?

【讨论】:

  • 我只能用malloc()
  • @Vladimir 那么 malloc 的全部目的可能会丢失。如果您事先知道并分配了所需的内存量,为什么还要使用动态分配?
【解决方案2】:
#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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多