我试图在由换行符分隔的文件(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;
}
我该怎么办?谢谢!
答案 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;
}