首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用fscanf正确读取

无法使用fscanf正确读取
EN

Stack Overflow用户
提问于 2015-11-28 21:27:49
回答 2查看 108关注 0票数 0

我有以下困难。我正在试着读这个文件。

代码语言:javascript
复制
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()的数组中。

这是我的代码:

代码语言:javascript
复制
#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;
}

是否正确读取文件,但如果我打印得到的数字:

代码语言:javascript
复制
3
5
2
3
4
2
EN

回答 2

Stack Overflow用户

发布于 2015-11-28 21:31:30

这里有两件事要提。

  1. 您通过malloc()仅为一个变量分配了内存,但是您试图在do...while循环中访问超出分配的内存。当你看到Why is “while ( !feof (file) )” always wrong?

时,你需要查看realloc()

票数 1
EN

Stack Overflow用户

发布于 2015-11-28 22:10:39

代码语言:javascript
复制
#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;
}

代码语言:javascript
复制
#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;
}

代码语言:javascript
复制
#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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33971864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档