C中的文件处理错误

时间:2015-06-07 14:28:57

标签: c file-handling

我正在学习C.中的文件处理。我有这段代码但它不接受字符串作为输入将它写入文件。任何帮助将不胜感激。

  #include<stdio.h>
#include<string.h>
#include <stdlib.h>

    int main(void)
    {
        FILE * fp1;
        fp1 = fopen("abc.txt","a+");
        if(fp1==NULL)
        {printf("An error occurred");
        }
        printf("Delete file?\n");


        int a,c;
        char name [20];
        int flag=1;
        int ch=1;
        while(flag!=0)
            {

                printf("Enter id input \n");

                scanf("%d",&a);
                fprintf(fp1,"\n%d\t",a);

                printf("Enter Name");
                gets(name);
                fputs(name, fp1);
                printf("Enter No \n");

        scanf("%d",&c);
        fprintf(fp1,"\t%d\t",c);



        printf("Write more then press 0 else 1");
        scanf("%d",&ch);
        if(ch==1)
            {
                flag=0;
            }
        }
        fclose(fp1);

    }

在运行此代码时,代码在输入名称后不接受输入,并直接跳到输入否。我希望输出以表格形式。

3 个答案:

答案 0 :(得分:2)

输入id后使用getchar(),因为第一个scanf的\ n保留在缓冲区中。

printf("Enter id input \n");
scanf("%d",&a);
getchar();                

答案 1 :(得分:1)

输入scanf("%d",&a);的号码时,输入一个数字,然后按 Enter 键。 scanf使用该数字并在标准输入流('\n')中保留换行符(stdin)。当程序执行到gets(name);时,gets会看到换行符并使用它,并将其存储在name中。

首先,永远不要使用gets as it is dangerous,因为它不会阻止buffer overflows。请改用fgets

fgets(name, sizeof(name), stdin);

其次,你必须摆脱换行符。您可以flushing the stdin执行此操作。或者,您只需在通过更改

scanf读取数字后立即扫描并丢弃换行符
scanf("%d",&a);

scanf("%d%*c",&a);

%*c扫描并丢弃一个角色。

答案 2 :(得分:0)

gets()已被弃用,请勿使用它。你仍然可以使用scanf() ...... 至于制表......想一想。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    FILE* fp1;
    fp1 = fopen("abc.txt", "a+");

    if (fp1 == NULL) {
        printf("An error occurred");
    }

    int a, c;
    char name [20];
    int flag = 1;
    int ch = 1;

    while (flag != 0) {

        printf("Enter id input:\n");
        scanf("%d", &a);
        fprintf(fp1, "%d\t", a);

        printf("Enter Name:\n");
        scanf("%s", name);
        fprintf(fp1, "%s\t", name);

        printf("Enter No:\n");
        scanf("%d", &c);
        fprintf(fp1, "%d\n", c);

        printf("Again (0) or Exit(1) ?:\n");
        scanf("%d", &ch);

        if (ch == 1) {
            flag = 0;
        }
    }

    fclose(fp1);

    return 0;
}