我希望能够更改此代码以使用直接I / O写出文件,而不是格式化流I / O?但是我不确定如何做到这一点,非常感谢帮助。
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define FORMATREAD "%12s %100s %100s"
int main(void)
{
FILE *in_ptr, *out_ptr;
char fname[MAX], lname[MAX], number [12];
in_ptr = fopen("phonelist.txt", "r");
out_ptr = fopen("history.txt", "w+");
if ((NULL == in_ptr) || (NULL == out_ptr))
{
fputs("Problem opening files , exiting!", stderr);
exit(1);
}
if (3 = fscanf(in_ptr , FORMATREAD , number , fname ,lname))
{
fprintf(out_ptr , "%s %s %s\n", number , fname , lname);
printf("%s %s %s\n", number , fname , lname);
printf("The phone book has format: phone number name\n");
}
else
{
fprintf(*out_ptr , "Unknown type\n");
printf("The phone book has unknown format\n");
}
fclose(in_ptr);
fclose(*out_ptr);
return 0;
}
我很擅长编码,如果有任何明显的错误,请对不起。
答案 0 :(得分:0)
要不使用fprintf()
之类的格式化输出,请使用sprintf()
或其他各种方法在内存中构造字符串并编写。确保buffer
足够大是重要的。
// fprintf(out_ptr , "%s %s %s\n", number , fname , lname);
// slightly oversize buffer, but it scales as the %s format and variables do.
char buffer[sizeof number + sizeof fname + sizeof lname + sizeof FORMATREAD];
sprintf(buffer, "%s %s %s\n", number , fname , lname);
fputs(buffer, out_ptr);
存在关于fscanf(in_ptr , FORMATREAD , number , fname ,lname)
暗示行格式化数据的担忧。 FORMATREAD
不检测'\n'
与' '
不同。建议使用fgets()
读取数据行,然后解析它。
代码还需要纠正缓冲区大小和输入格式
#define MAX 100
#define FORMATREAD "%12s %100s %100s"
...
char fname[MAX+1], lname[MAX+1], number[12+1];
好的代码是检查输入函数的retrun值,但需要使用==
而不是=
@Weather Vane
// if (3 = fscanf(in_ptr , FORMATREAD , number , fname ,lname))
if (3 == fscanf(in_ptr , FORMATREAD , number , fname ,lname))