我有这段代码来编写一个名为Phone Bill.txt
#include<stdio.h>
int main(){
FILE *file;
file=fopen("Phone Bill.txt","w");
if(file!=NULL){
fprintf(file, "Number\t\tLocal Call Chargers\tInternational Call Charges\tRoaming Charges\n");
}
double phoneNumber;
float localCharges, internationalCharges, roamingCharges;
char wantToContinue='Y';
while(wantToContinue=='Y'){
printf("Enter Phone Number: ");
scanf("%lf",&phoneNumber);
printf("Enter Local Call Charges: ");
scanf("%f",&localCharges);
printf("Enter International Call Charges: ");
scanf("%f",&internationalCharges);
printf("Enter Roaming Call Charges: ");
scanf("%f",&roamingCharges);
if (file!=NULL)
fprintf(file, "%.0lf\t%.0f\t\t\t%.0f\t\t\t\t%.0f\n",phoneNumber,localCharges,internationalCharges,roamingCharges);
printf("\n");
printf("Want to Continue Writing? (Y/N)");
scanf(" %c",&wantToContinue);
if(wantToContinue=='Y'){
wantToContinue='Y';
}else if(wantToContinue=='N'){
wantToContinue='N';
fclose(file);
}
printf("\n");
}
return 0;
}
以下是将内容写入文件后Phone Bill.txt
的屏幕截图:
这是我用来从Phone Bill.txt
文件中读取内容(数字)的代码:
#include<stdio.h>
int main(){
FILE *file;
char strings[200];
double phoneNumber;
float localCharges, internationalCharges, roamingCharges;
file=fopen("Phone Bill.txt","r");
if(file!=NULL){
fscanf(file,"%.0lf\t%.0f\t\t\t%.0f\t\t\t\t%.0f\n",phoneNumber,localCharges,internationalCharges,roamingCharges);
printf("%.0lf %0.f %0.f %0.f",phoneNumber,localCharges,internationalCharges,roamingCharges);
}
return 0;
}
但我的输出是:
0 0 0 0
能否告诉我为什么会收到此错误?*
谢谢!
答案 0 :(得分:1)
首先,您正在尝试扫描文件的第一行标题。
其次,您需要从fscanf
格式定义中删除所有噪声:这些格式类型会自动忽略前导空格。
第三,您需要将地址传递给fscanf
。这是一个有效的编辑。
#include <stdio.h>
int main(){
FILE *file;
char strings[200];
double phoneNumber;
float localCharges, internationalCharges, roamingCharges;
file=fopen("Phone Bill.txt","r");
if(file!=NULL){
fgets(strings, sizeof strings, file); // read the headings
fscanf(file,"%lf%f%f%f", &phoneNumber, &localCharges, &internationalCharges, &roamingCharges);
printf("%.0lf %0.f %0.f %0.f", phoneNumber, localCharges, internationalCharges, roamingCharges);
fclose(file); // don't forget to close
}
return 0;
}
此外,您必须检查fscanf
的返回值,该值应为4
扫描的项目数。
最后,我建议phoneNumber
不应该是double
甚至unsigned long long
,而应该是char phoneNumber[MAXPHLEN]
。电话号码可以以0
或00
开头,否则会丢失。更一般地说,这也将容纳IDD中使用的+
以及在某些电话拨号上使用的字母等效数字。
EDIT 。我限制字符串输入长度以防止溢出,并检查扫描的项目数 - 在循环中读取所有数据。
#include <stdio.h>
#define MAXPHLEN 50
int main(){
FILE *file;
char strings[200];
char phoneNumber[MAXPHLEN];
float localCharges, internationalCharges, roamingCharges;
file=fopen("Phone Bill.txt","r");
if(file!=NULL){
fgets(strings, sizeof strings, file); // read the headings
while((fscanf(file,"%49s%f%f%f", phoneNumber, &localCharges, &internationalCharges, &roamingCharges)) == 4) {
printf("%s %0.f %0.f %0.f\n", phoneNumber, localCharges, internationalCharges, roamingCharges);
}
fclose(file); // don't forget to close
}
return 0;
}
答案 1 :(得分:0)
将fscanf更改为指向变量:
所以:
fscanf(file,"%.0lf\t%.0f\t\t\t%.0f\t\t\t\t%.0f\n",&phoneNumber,&localCharges,&internationalCharges,&roamingCharges)
答案 2 :(得分:0)
一般来说,应该始终使代码尽可能简单(并且不要简单)
以下提议的代码:
注意:由于文件已经格式化,只需要将行回显到终端。
#include <stdio.h> // fgets(), fopen(), fclose(), puts(), perror()
#include <stdlib.h> // exit(), EXIT_FAILURE
int main( void )
{
char strings[200];
FILE *fp = fopen("Phone Bill.txt","r");
if( !fp )
{
perror( "fopen to read Phone Bill.txt failed" );
exit( EXIT_FAILURE );
}
// implied else, fopen successful
// read, print each line:
while( fgets( strings, sizeof( strings ), fp ) )
{
puts( strings );
}
if( !feof( fp ) )
{ // then read error
perror( "read of Phone Bill.txt failed" );
fclose( fp );
exit( EXIT_FAILURE );
}
fclose( fp );
return 0;
} // end function: main
关于OP发布的代码来读取文件:
\t
是&#39;空格&#39;,所以不应该是fscanf()
格式字符串
文件的第一行不是数据的一部分,因此需要单独阅读,建议使用fgets()
读入strings[]
然后可以立即与puts()
< / p>
通过文件末尾的第二行可以很容易地阅读:
while( 4 == fscanf( file, " %lf %f %f %f", &phoneNumber, &localCharges, &internationalCharges, &roamingCharges ) )
{
....
}
fscanf()
的格式字符串可以进一步缩小(因为%f和%lf输入/格式规范会丢弃前导&#39;空格&#39;到:
"%lf%f%f%f"