繁体   English   中英

读取 c 中的文件时出现问题

[英]problem reading a file in c

这个 function 应该得到一个向量文件。 第一行包含维度。 所有其他行都采用“P:3,5,2”的形式。 字母是 P 或 N,数字是坐标。 此 function 每次调用时都会读取一行,并将 P/N 字符和坐标保存到双精度数组中。

void readSamplesFile(FILE *sample_p, double result[])
{
    if (dimension == 0)
    {
    fscanf(sample_p,"%lf",&dimension);
    }
    printf("dimentions: %lf\n",dimension);
    printf("LINE \n");
    int index;
    for (index = 0; index<dimension; index++)
    {
        printf("%d",index);
        fscanf(sample_p,"%lf%*[:,]",&result[index]);
        printf("%lf",result[index]);
    }
}      

当我运行它时,我得到一个无限循环。 尺寸被正确读取,但它打印

LINE 
00.00000010.000000dimentions: 2.000000

不休。 任何想法为什么? 希望我很清楚

编辑:我添加了调用 function:

void fillArray(FILE *sample_p,FILE *separators_p){
    double coordinates[MAX_DIMENSION];
    while (!feof(sample_p)){
        readSamplesFile(sample_p,coordinates);
    }
}

ps fscanf 设置为读取:并且,但忽略它们。

'P' 和 'N' 都不是有效的双精度数,它们也不是 ':' 或 ',',因此fscanf()失败。 您应该始终检查fscanf()的返回值。

我们还可以讨论使用fgets()读取一行并使用sscanf()解析它是否会更好。 这样做可以避免一些问题; 这是我自动编码的方式。


此代码似乎适用于输入文件:

3
P:3,5,2
N:21.12,2.345e6,1.9132e-34

产生 output:

dimension: 3.000000
LINE: P:3,5,2
P:offset=2:0=3(2):1=5(4):2=2(6):
LINE: N:21.12,2.345e6,1.9132e-34
N:offset=2:0=21.12(2):1=2.345e+06(8):2=1.9132e-34(16):

我仍然不热衷于(误)使用浮点dimension ,但它有效。

#include <stdio.h>

enum { MAX_DIMENSION = 6 };
enum { MAX_BUFFSIZE  = 4096 };

static double dimension = 0.0;

static int get_dimension(FILE *fin)
{
    char buffer[MAX_BUFFSIZE];

    if (fgets(buffer, sizeof(buffer), fin) == 0)
        return -1;
    if (sscanf(buffer, "%lf", &dimension) != 1)
        return -1;
    printf("dimension: %lf\n", dimension);
    return 0;
}

static int readSamplesFile(FILE *sample_p, double result[])
{
    char buffer[MAX_BUFFSIZE];
    if (fgets(buffer, sizeof(buffer), sample_p) == 0)
        return -1;
    printf("LINE: %s", buffer);

    char c;
    int offset;
    if (sscanf(buffer, " %c:%n", &c, &offset) != 1)
        return -1;
    printf("%c:", c);
    printf("offset=%d:", offset);
    for (int index = 0; index < dimension; index++)
    {
        int newoff;
        if (sscanf(&buffer[offset], "%lf%*[:,]%n", &result[index], &newoff) < 1)
            return -1;
        printf("%d=%g(%d):", index, result[index], offset);
        offset += newoff;
    }
    putchar('\n');
    return 0;
}

static void fillArray(FILE *sample_p)
{
    double coordinates[MAX_DIMENSION];
    while (readSamplesFile(sample_p, coordinates) == 0)
        ;
}

int main(void)
{
    if (get_dimension(stdin) == 0)
        fillArray(stdin);
    return 0;
}

请注意,所写的fillArray() function 不会对数据行做任何事情。 没有检查指定的尺寸是否为正且不大于MAX_DIMENSION (这将 go in get_dimension() )。 get_dimension()分成单独的 function 比将其隐藏在readSampleFile()中感觉更干净。 有一种说法是readSampleFile()应该重命名为readSampleLine()因为它一次只处理一行,而不是一次处理整个文件。

%n格式说明符的使用有点棘手,但代码需要知道在下一个周期从哪里恢复读取缓冲区。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM