如何从C中的文件中读取文本/数字

时间:2017-06-11 17:39:44

标签: c file file-io

我有这段代码来编写一个名为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 Screenshot

这是我用来从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

能否告诉我为什么会收到此错误?*

谢谢!

3 个答案:

答案 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]。电话号码可以以000开头,否则会丢失。更一般地说,这也将容纳IDD中使用的+以及在某些电话拨号上使用的字母等效数字。

来自OP关于使用字符串作为电话号码的评论中的

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)

一般来说,应该始终使代码尽可能简单(并且不要简单)

以下提议的代码:

  1. 干净利落地编译
  2. 执行所需的功能
  3. 注意:由于文件已经格式化,只需要将行回显到终端。

    #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"