C编程帮助,如何使用C中的fopen和fprintf函数将给定的输出保存在文本文件中?

时间:2014-12-16 06:07:35

标签: c printf fopen

上次我使用此代码时,它工作正常。我希望将输出保存到文本文件中(通过fprintf()打印的任何内容)。现在,当我尝试再次运行代码时,它不会将输出保存在给定的文本文件draftday.txt中。任何帮助将不胜感激。

#include <stdio.h>
#include <conio.h>
#include <cstdlib>

int main()
{ 
    struct date
    {
        int day;
        int month;
        int year;
    };

    struct details
    {
        char name[50];
        int price;
        int code;
        int qty;
        struct date mfg;
    };

    struct details item[50];
    int n,i;

    getch();

    fflush(stdin);
    printf("Enter number of items:");
    scanf("%d",&n);     

    for(i=0;i<n;i++)
    {
        fflush(stdin);
        printf("Item name:");
        scanf("%[^\n]",item[i].name);

        fflush(stdin);
        printf("Item code:");
        scanf("%d",&item[i].code);

        fflush(stdin);
        printf("Quantity:");
        scanf("%d",&item[i].qty);

        fflush(stdin);
        printf("price:");
        scanf("%d",&item[i].price);

        fflush(stdin);
        printf("Manufacturing date(dd-mm-yyyy):");
        scanf("%d-%d-%d",&item[i].mfg.day,&item[i].mfg.month,&item[i].mfg.year);
    }

    {
    FILE *fptr;
    fptr=(fopen("draftday.txt","w"));
    if(fptr==NULL){
       printf("Error!");
       exit(1);
    }

    fprintf(fptr,"             *****  INVENTORY *****\n\n\n"
                 "------------------------------------------------------------------\n\n"
                 "S.N.|    NAME           |   CODE   |  QUANTITY |  PRICE  |MFG.DATE\n\n"
                 "------------------------------------------------------------------\n\n");


    for(i=0;i<n;i++){
        fprintf(fptr, "%d     %-15s        %-d          %-5d     %-5d       %d/%d/%d\n",i,item[i].name,item[i].code,item[i].qty,item[i].price,
                item[i].mfg.day,item[i].mfg.month,item[i].mfg.year);
    }

    fclose(fptr);
    getch();
    }
}

4 个答案:

答案 0 :(得分:0)

我想你忘记了for循环:

        fprintf(fptr, "%d     %-15s        %-d          %-5d     %-5d     %d/%d/%d\n",i+1,item[i].name,item[i].code,item[i].qty,item[i].price,
                item[i].mfg.day,item[i].mfg.month,item[i].mfg.year);

尝试:

     for(i=0;i<n;i++)
     {
        fprintf(fptr, "%d     %-15s        %-d          %-5d     %-5d     %d/%d/%d\n",i+1,item[i].name,item[i].code,item[i].qty,item[i].price,
                item[i].mfg.day,item[i].mfg.month,item[i].mfg.year);
     }

此外,您正在追加模式下打开输出文件。我不确定你是否打算这样做。如果没有,请更改

fptr=(fopen("draftday.txt","a"));

fptr=(fopen("draftday.txt","w"));

答案 1 :(得分:0)

这里有两点需要注意:

  1. 您正在阅读n个项目,但只写n+1项,这完全无效。

  2. 您从未检查scanf()的返回值以确保成功。

  3. 要更正:

    1. 使用您用于输入的相同for循环条件。
    2. 最后不要忘记fclose()文件。
    3. fopen()部分移到建议的for循环之外。

    4. 编辑:

      在linux上,下面的代码可以正常工作。

      #include <stdio.h>
      #include <stdlib.h>
      
      
      struct date
      {
          int day;
          int month;
          int year;
      };
      
      struct details
      {
          char name[50];
          int price;
          int code;
          int qty;
          struct date mfg;
      };
      
      
      int main()
      {
      
      struct details item[50];
      int n,i;
      
      printf("Enter number of items:");
      scanf("%d",&n);
      
      
      for(i=0;i<n;i++)
      {
          getchar();
          printf("Item name:");
          scanf("%[^\n]",item[i].name);
      
      
          printf("Item code:");
          scanf("%d",&item[i].code);
      
      
          printf("Quantity:");
          scanf("%d",&item[i].qty);
      
      
          printf("price:");
          scanf("%d",&item[i].price);
      
      
          printf("Manufacturing date(dd-mm-yyyy):");
          scanf("%d-%d-%d",&item[i].mfg.day,&item[i].mfg.month,&item[i].mfg.year);
      }
      
      {
      FILE *fptr;
      fptr=(fopen("draftday.txt","a"));
      if(fptr==NULL){
         printf("Error!");
         exit(1);}
      
      fprintf(fptr,"             *****  INVENTORY *****\n\n\n"
                   "------------------------------------------------------------------\n\n"
                   "S.N.|    NAME           |   CODE   |  QUANTITY |  PRICE  |MFG.DATE\n\n"
                   "------------------------------------------------------------------\n\n");
      
      
      for(i=0;i<n;i++)
                  fprintf(fptr, "%d     %-15s        %-d          %-5d     %-5d     %d/%d/%d\n",i+1,item[i].name,item[i].code,item[i].qty,item[i].price,
                    item[i].mfg.day,item[i].mfg.month,item[i].mfg.year);
      
      fclose(fptr);
      }
      }
      

答案 2 :(得分:0)

数据不存储在结构本身中。 将数据存储在文件中时,必须给出循环以存储数组中每个位置的所有数据。 只有这样,数据才会从该位置获取并存储在文件中。

试试这个:

for (i = 0 ; i < n ; i ++) {

            fprintf(fptr, "%d %-15s %-d %-5d %-5d %d/%d/%d\n",i+1,item[i].name,item[i].code,item[i].qty,item[i].price,
                            item[i].mfg.day,item[i].mfg.month,item[i].mfg.year);

}

如果你想澄清打印结构中的数据。

答案 3 :(得分:0)

我对您的代码进行了一些更改。试试这个。确保您的文件位于当前目录中。或者给出完整的路径名称。

#include <stdio.h>
#include <stdlib.h>
int main()
{
    struct date
    {
            int day;
            int month;
            int year;
    };

    struct details
    {
            char name[50];
            int price;
            int code;
            int qty;
            struct date mfg;
    };

    struct details item[50];
    int n,i;


    printf("Enter number of items:");
    scanf("%d",&n);
    FILE *fptr;
    fptr=(fopen("draftday.txt","a"));
    if(fptr==NULL){
            printf("Error!");
            exit(1);}

    fprintf(fptr,"             *****  INVENTORY *****\n\n\n""------------------------------------------------------------------\n\n""S.N.|    NAME           |   CODE   |  QUANTITY |  PRICE  |MFG.DATE\n\n""------------------------------------------------------------------\n\n");

    for(i=0;i<n;i++)
    {
            printf("Item name:");
            scanf(" %[^\n]",item[i].name);

            printf("Item code:");
            scanf(" %d",&item[i].code);

            printf("Quantity:");
            scanf(" %d",&item[i].qty);

            printf("price:");
            scanf(" %d",&item[i].price);

            printf("Manufacturing date(dd-mm-yyyy):");
            scanf(" %d-%d-%d",&item[i].mfg.day,&item[i].mfg.month,&item[i].mfg.year);


            fprintf(fptr, "%d     %-15s        %-d          %-5d     %-5d     %d/%d/%d\n",i+1,item[i].name,item[i].code,item[i].qty,item[i].price,item[i].mfg.day,item[i].mfg.month,item[i].mfg.year);


    }
 }

我做的改变。

我在获取输入后存储数据。对我而言,它运作得很好。