[英]How to write a subprogram to read from a binary file and write in a text file?
#include<stdio.h>
typedef struct {
char floare[40];
char culoare[30];
float pret;
int codf;
}FLOARE;
void creare_fisier(char*nume) {
FILE*g;
FLOARE f;
fopen_s(&g, nume, "wb");
if (!g)
printf("Eroare");
else
{
printf("Cod floare:"); scanf_s("%d", &f.codf);
while (!feof(stdin)) {
getchar();
printf("Nume floare:"); gets(f.floare);
printf("Culoare floare:"); gets(f.culoare);
printf("Pret:"); scanf_s("%f", &f.pret);
fwrite(&f, sizeof(FLOARE), 1, g);
printf("Cod floare:"); scanf_s("%d", &f.codf);
}
fclose(g);
}
}
void afisare_fisier(char*nume) {
FILE*h;
FLOARE f;
fopen_s(&h, "lista.dat", "rb");
if (!h)
printf("Eroare");
else {
FILE*g;
fopen_s(&g, nume, "w");
fread(&f, sizeof(FLOARE), 1, g);
while (!feof(h)) {
fprintf(g, "%d %s %s %f", f.codf, f.floare, f.culoare, f.pret);
fread(&f, sizeof(FLOARE), 1, g);
}
fclose(g), fclose(h);
}
}
void main() {
char numef[] = "lista.dat";
creare_fisier(numef);
char numetxt[] = "raport.txt";
afisare_fisier(numetxt);
}
创建二进制文件的子程序正在运行,但将信息列表到文本文件中却不起作用。 当我运行代码时,它没有发生任何事情,并且文本文件占用的空间随着我一直打开控制台而增长。 我对子程序没有真正的经验,但我知道列表到文本文件中的结构。
这是家庭作业。
当我运行代码时,它没有发生任何事情,并且文本文件占用的空间随着我一直打开控制台而增长。
这是因为你用FEOF,你得到混合和scanf
请注意,您还(尝试)在afisare_fisier
读取g而不是h
这里有一个建议:
我总是使用fgets在stdin上读取,首先是因为这允许指示读取的最大大小,而get可以溢出接收到的缓冲区,并且不必执行getchar()或等效的操作以希望绕过换行符等。
换行符是读取字符串的一部分,因此在floare和culoare字段中,您可能必须删除它们。
如果floare和culoare是单词并且不包含空格,您可以将fgets (+ sscanf ) 替换为fscanf以在floare和culoare 中没有换行符(不要忘记在fscanf字符串时指明最大大小) .
请注意,使用fgets的结果来检测 EOF(而不是feof )我不必在源中放置两次。
我在文件打开时添加了检查
我在afisare_fisier
参数中给出了两个文件的名称,因为没有理由知道输入文件的名称。
因为EOF不容易从标准输入中读取,当无法对Cod floare进行sscanf时,我也会停下来阅读,这允许在空行上终止(用户之前只是点击<enter>
而没有数字)
typedef struct {
char floare[40];
char culoare[30];
float pret;
int codf;
}FLOARE;
void creare_fisier(char*nume) {
FILE*g;
FLOARE f;
fopen_s(&g, nume, "wb");
if (!g)
printf("Eroare");
else
{
char s[32];
for (;;) {
printf("Cod floare:");
if ((fgets(s, sizeof(s), stdin) == NULL) ||
(sscanf(s, "%d", &f.codf) != 1))
break;
printf("Nume floare:");
if (fgets(f.floare, sizeof(f.floare), stdin) == NULL)
break;
printf("Culoare floare:");
if (fgets(f.culoare, sizeof(f.culoare), stdin) == NULL)
break;
printf("Pret:");
if ((fgets(s, sizeof(s), stdin) == NULL) ||
(sscanf(s, "%f", &f.pret) != 1))
break;
fwrite(&f, sizeof(f), 1, g);
}
fclose(g);
}
}
void afisare_fisier(char * in, char * out) {
FILE*h;
FLOARE f;
fopen_s(&h, in, "rb");
if (!h)
printf("Eroare (in)");
else {
FILE*g;
fopen_s(&g, out, "w");
if (!g)
printf("Eroare (out)");
else {
while (fread(&f, sizeof(f), 1, h) == 1) { /* read in h, not in g */
fprintf(g, "%d %s %s %f\n", f.codf, f.floare, f.culoare, f.pret);
}
fclose(g);
}
fclose(h);
}
}
int main() {
char numef[] = "lista.dat";
creare_fisier(numef);
char numetxt[] = "raport.txt";
afisare_fisier(numef, numetxt);
}
编译和执行:
pi@raspberrypi:/tmp $ gcc -g -pedantic -Wextra f.c
pi@raspberrypi:/tmp $ ./a.out
Cod floare:123
Nume floare:nume1
Culoare floare:culoare1
Pret:12.34
Cod floare:456
Nume floare:nume2
Culoare floare:culoare2
Pret:21.4
Cod floare:
pi@raspberrypi:/tmp $ cat raport.txt
123 nume1
culoare1
12.340000
456 nume2
culoare2
21.400000
注意:当请求第三个Cod floare时,我点击了<enter>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.