C - 在换行符中以纯文本文件结构变量写入

时间:2014-12-13 17:00:27

标签: c file struct newline

我试图在由换行符分隔的文件(config.dat)中编写struct数据类型的变量,即:

9001
00
128930
2

但我只能写空间:

9001001289302

这是代码:

int main()
{
  typedef struct
  {
    char cp[4];
    char id[2];
    char correlative[6];
    char digit[1];
  } log;

  FILE *fl;
  log new_log;

  fl = fopen("config.dat", "w");

  printf ("\nCP: ");
  gets (new_log.cp);
  printf ("ID: ");
  gets (new_log.id);
  printf ("Correlative: ");
  gets (new_log.correlative);
  printf ("Digit");
  gets (new_log.digit);

  fwrite(&new_log, sizeof(log), 1, fl);

  fclose(fl);

  return 0;
}

我该怎么办?谢谢!

4 个答案:

答案 0 :(得分:3)

这就是你真正需要的。

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

int main()
{
    typedef struct
    {
        char cp[1 + 1 + 4];
        char id[1 + 1 + 2];
        char correlative[1 + 1 + 6];
        char digit[1 + 1 + 1];
    } log;
    /* I add `1' for the terminating null byte '\0', and another `1' for the `\n` new line */

    FILE *fl;
    log   new_log;

    fl = fopen("config.dat", "w");
    if (fl == NULL)
        return 1;

    printf ("\nCP: ");
    fgets (new_log.cp, sizeof(new_log.cp), stdin);
    fprintf (fl, "%s", new_log.cp);

    printf ("ID: ");
    fgets (new_log.id, sizeof(new_log.id), stdin);
    fprintf (fl, "%s", new_log.id);

    printf ("Correlative: ");
    fgets (new_log.correlative, sizeof(new_log.correlative), stdin);
    fprintf (fl, "%s", new_log.correlative);

    printf ("Digit: ");
    fgets (new_log.digit, sizeof(new_log.digit), stdin);
    fprintf (fl, "%s", new_log.digit);


    fclose(fl);

    return 0;
}

请注意我已使用fgets来避免缓冲区溢出。

答案 1 :(得分:1)

编写数据的方式是错误的,如果使用fwrite(),则将完整的数据块写入文件而不插入任何换行符。如果您想插入换行符,那么您应该使用fprintf()之类的内容或在fwrite()之间手动插入换行符

答案 2 :(得分:0)

如果您的数据是

9001
00
128930
2

struct typedef应为

typedef struct
  {
    char cp[5];
    char id[3];
    char correlative[7];
    char digit[2];
  } log;

例如9001将作为9001 \ 0存储在cp成员中,而零成员将在id成员上溢出,依此类推,这就是为什么你得到9001001289302 ......

答案 3 :(得分:0)

我做了一些改变。 Luca是对的,但只有当我使用fprintf代替fwrite时才能使用:

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

int main()
{
  typedef struct 
  {
    char cp[5];
    char id[3];
    char correlative[7];
    char digit[2];
  } log;

  FILE *fl;
  log new_log;

  if (!(fl = fopen("config.dat", "w")))
  { 
    printf ("An error occurred while opening file.\n");
  }
  else
  {
    printf ("\nIntroducir codigo postal (5 digitos): ");
    scanf ("%s", new_log.cp);
    printf ("Introducir identificador de la administracion (2 digitos): ");
    scanf ("%s", new_log.id);
    printf ("Introducir numero correlativo (7 digitos): ");
    scanf ("%s", new_log.correlative);
    printf ("Introducir precio de la apuesta: ");
    scanf ("%s", new_log.digit);

    fprintf(fl, "%s %s %s %s", new_log.cp, new_log.id, new_log.correlative, new_log.digit);
  }

  fclose(fl);

  return 0;
}