有人能告诉我在这个C程序中我做错了什么吗?

时间:2014-12-10 10:41:41

标签: c visual-studio-2010 printf fopen

我正在尝试将程序中打印的所有内容作为输出写入名为" abcd.txt"的文件中。每当我运行程序时,它运行正常并退出但文件" abcd.txt"没有书面内容。

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

    };

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

    struct details item[50];
    int n,i;
    FILE *fp;

    getch();


    fprintf(stderr,"Enter number of items:");
    scanf("%d",&n);
    fflush(stdin);
    fp = fopen( "abcd.txt", "w+" ); // Open file for writing

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

        fflush(stdin);
        fprintf(stderr,"Item name:");     
        scanf("%[^\n]",item[i].name);

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

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

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

        fprintf(stderr,"Manufacturing date(dd-mm-yyyy):");
        scanf("%d-%d-%d",&item[i].mfg.day,&item[i].mfg.month,&item[i].mfg.year);
        fclose(fp);
    }
    fprintf(stderr,"             *****  INVENTORY *****\n");
    fprintf(stderr,"------------------------------------------------------------------\n");
    fprintf(stderr,"S.N.|    NAME           |   CODE   |  QUANTITY |  PRICE  |MFG.DATE\n");
    fprintf(stderr,"------------------------------------------------------------------\n");
    for(i=0;i<n;i++)
        fprintf(stderr,"%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);
    fprintf(stderr,"------------------------------------------------------------------\n");
    fclose(fp);
    getch();
}    

这些是编译器告诉我的错误:&#39; Code Final.exe&#39;:已加载&#39; C:\ Users \ Qsmrf \ Documents \ Visual Studio 2010 \ Projects \ qasimproject \ Code Final \ Code Final \ Debug \ Code Final.exe&#39;,符号已加载。

&#39; Code Final.exe&#39;:已加载&#39; C:\ Windows \ System32 \ ntdll.dll&#39;,无法找到或打开PDB文件

&#39; Code Final.exe&#39;:已加载&#39; C:\ Windows \ System32 \ kernel32.dll&#39;,无法找到或打开PDB文件

&#39; Code Final.exe&#39;:已加载&#39; C:\ Windows \ System32 \ KernelBase.dll&#39;,无法找到或打开PDB文件

&#39; Code Final.exe&#39 ;:已加载&#39; C:\ Windows \ System32 \ msvcr100d.dll&#39;,已加载符号。

程序&#39; [3256] Code Final.exe:Native&#39;已退出代码0(0x0)。

5 个答案:

答案 0 :(得分:2)

这是因为您没有向fp写任何内容。而不是fprintf(stderr,"Item name:"),使用类似

的内容
fprintf(fp,"Item name:");

同时确保文件成功打开并仅在最后关闭它。

答案 1 :(得分:1)

int fprintf(FILE *stream, const char *format, ...)

该流应该是您要将数据写入的文件。这是fp但我们没有看到任何内容写入您的文件。喜欢

fprintf(fp,"price");

答案 2 :(得分:1)

这里不止一件事需要注意。

  1. void main()更改为int main(),最后添加return 0

  2. 将结构定义移到main()之外,并且可以移动到您可以包含的某个头文件中。好的做法。

  3. p = fopen( "abcd.txt", "w+" );之后,检查fopen()是否成功。如果成功,则使用fp

  4. fprintf(stderr,"price:");这会将您的所有输出数据重定向到stderr,而不是fp。如果您希望将输出放在指定的文件中,请将stderr更改为fp

  5. 读取数据后,使用fprintf(fp, ...);将数据输出(写入)到文件。 [这一点有点冗余到第4点。]

  6. 您有多个fclose(fp);。删除所有其他[存在于循环中]并保留在结束之前[可能的return语句。]

答案 3 :(得分:0)

  1. 你需要写入你打开的文件描述符而不是stderr。 例如:它应该是fprintf(fp, "abcd");而不是fprintf(stderr, "adcd");
  2. 您正在关闭for循环中的fp。你应该在主要结束时关闭它。因此,删除for循环中的语句。
  3. 即便如此,输出也不会采用您输入的值。由于您正在读取值但未存储在文件中。为此,在这种情况下,您需要使用fprintf()将值存储到文件中。

答案 4 :(得分:0)

因为您没有将文件指针用于该对应文件。然后用w +打开它会截断其中的内容。

然后使用fp to wrte in file而不是stderr。然后你两次使用fclose。

fprintf(stderr,"             *****  INVENTORY *****\n"); 

从这一行开始,你必须使用fp存储在文件而不是stderr。