C中的fscanf() - 需要帮助使用指针表示法读取文件

时间:2015-11-16 06:39:06

标签: c

花了一两个小时试图调试它,但无法弄清楚为什么它不会正确读取我的文件。

FILE *input;
int numAccounts = 7;
char **accountNames = malloc(sizeof(char)*numAccounts*10);
int *accountNumbers = malloc(sizeof(int)*numAccounts);
float *accountValues = malloc(sizeof(float)*numAccounts);
char *fileName = malloc(sizeof(char)*20);
input=fopen("input.txt","r");
int i;

for(i=0;i<numAccounts;i++) {
    fscanf(input,"%s%d%f",*(accountNames+i),accountNumbers+i,accountValues+i);
    printf("\n%s %d %f", *(accountNames+i), *(accountNumbers+i), *(accountValues+i));
}
fclose(input);
return 0; 

这是input.txt

Brown 1435 234.55
Dunn 2091 2011.75
Smith 8766 945.05
Stone 4530 0.0
Becker 9073 6235.75
Rich  1003 -42.00
Doe 6739 3655.80

谢谢!

2 个答案:

答案 0 :(得分:0)

如果帐户值是货币。您可能希望将它们保存为整数并除以该货币的最低统一值。

因此,不要将float accountValue = 23.25保存为23.25,而是将其另存为2335(23.25 * 100)。

然后当你读到它时除以100得到那个值。

float accountValueDollars;
int accountValueInCents;

fscanf(..., &accountValueInCents);
accountValueDollars = accountValueInCents / 100;

此外,您可能需要考虑以二进制格式保存,这样您就不必担心解析文本了。

typedef struct _account_t{
  char name[50];
  int  account_number;
  double amount; 
} account_t;

int how_many = 0;
account_t * accounts = NULL;

// error checking skipped
fread(&how_many, 1, sizeof(int), input);

accounts = (account_t*)malloc(sizeof(account_t) * how_many);

for(int i = 0; i < how_many; i++){
  fread(&accounts[i], 1, sizeof(account_t), input);
  // print here or whatever
}

fclose(input);

注意:未经测试的代码。

答案 1 :(得分:0)

您应该从非动态分配开始,

int main()
{
    FILE *input = NULL;
    int numAccounts = 7;

    char accountNames[20] = "";
    int accountNumbers = 0;
    float accountValues = 0;

    input=fopen("input.txt","r");
    int i;

    for(i=0;i<numAccounts;i++) 
    {
        fscanf(input,"%s %d %f",accountNames,&accountNumbers,&accountValues);
        printf("\n%s %d %f\n", accountNames, accountNumbers, accountValues);
    }
    fclose(input);
    return 0; 
}

如果你必须进行动态分配,那么这个指向char分配的指针是不正确的: char **accountNames = malloc(sizeof(char)*numAccounts*10);

您需要首先分配numAccounts char *,然后为每个char *分配10个字符。这可以按如下方式完成:

    char **accountNames = malloc(sizeof(char*)*numAccounts);    // allocate numAccounts of char *
    int i;
    for( i=0; i < numAccounts; i++ )
    {
        *(accountNames + i) = malloc(sizeof(char)*10);            // allocate 10 of char
    }

所以这应该有效:

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

int main()
{
    FILE *input = NULL;
    int numAccounts = 7;

    char **accountNames = malloc(sizeof(char*)*numAccounts);    // allocate numAccounts of char *
    int i;
    for( i=0; i < numAccounts; i++ )
    {
        *(accountNames + i) = malloc(sizeof(char)*10);            // allocate 10 of char
    }
    int *accountNumbers = malloc(sizeof(int)*numAccounts);
    float *accountValues = malloc(sizeof(float)*numAccounts);

    input=fopen("input.txt","r");
    for(i=0; i<numAccounts; i++)
    {
        fscanf(input,"%s%d%f",*(accountNames+i), accountNumbers+i, accountValues+i);
        printf("\n%s %d %f", *(accountNames+i), *(accountNumbers+i), *(accountValues+i));
    }
    fclose(input);
    return 0; 
}