从文件中读取数据,c

时间:2018-01-18 10:15:31

标签: c file

我在c中练习文件的主题,我目前正在学习基础知识,这意味着我不能控制语言中内置的所有函数,在某些命令中,所以如果你能根据基本命令和某些东西来解释我会感谢你。

该计划的作用: 吸收学生和#39;数据(身份证,姓名和电话),并在文件中打印每个学生的数据(每个学生的信息将以新的名义写成)

我的代码问题是什么: 我写了一个打印出文件中所有数据的函数,如果用户插入了多个学生,该函数只打印文件中的第一行,就是它。

当我使用F10时,我进入循环,而第一次运行打印出第一个学生的详细信息,然后第二次运行,fscanf命令返回一个值(-1)并且没有打印出详细信息第二个学生。

我很乐意指导和纠正。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct studnt
{
    int id;
    int number;
    char *name;
}typedef s_studnt;
void print_studnt(FILE *q,char name_file[])
{
    int id, number;
    char str_name[20];
    q=fopen(name_file, "r");
    if (q == NULL)
    {
        printf("eror fac\n");
        return;
    }
    printf("\n");
    while (!feof(q))
    {

        fscanf(q, "%d %s %d", &id, str_name, &number); //at the next loop, fscanf return -1
        printf("studnt name:%s\nthe id studnt:%d\ntelephon number:%d\n", str_name, id, number);
        printf("\n");
    }
    fclose(q);
    return;
}
int main()
{
    int size, i, length;
    char str[20], name_file[20];
    FILE *q = NULL;
    s_studnt *studnt = NULL;
    printf("how much studnt you have:\n");
    scanf("%d", &size);
    studnt = (s_studnt*)malloc(size * sizeof(s_studnt));
    if (studnt == NULL)
    {
        printf("eror 1\n");
        return 0;
    }
    printf("enter file name:\n");
    scanf("%s", name_file);
    q = fopen(name_file, "w");
    if (q == NULL)
    {
        printf("eror file\n");
        return 0;
    }
    fclose(q);
    for (i = 0; i < size; i++)
    {
        printf("enter studnt name:\n");
        scanf("%s", str);
        length = strlen(str);
        studnt[i].name = (char*)malloc(length+1 * sizeof(char));
        if (studnt[i].name == NULL)
        {
            printf("eror2\n");
            return 0;
        }
        strcpy(studnt[i].name, str);
        printf("enter the id studnt:\n");
        scanf("%d", &studnt[i].id);
        printf("enter your telephon number:\n");
        scanf("%d", &studnt[i].number);
        q = fopen(name_file, "a");
        if (q == NULL)
        {
            printf("eror write\n");
            return 0;
        }
        fprintf(q, "%d %s %d\n", studnt[i].id, studnt[i].name, studnt[i].number);

    }
    fclose(q);
    print_studnt(q,name_file);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

以下代码正常运行。你必须注意不要经常打开和关闭文件,即在循环内:打开文件,循环并关闭循环后面的文件。

然后fscanf()出现了问题。 fscanf()会一直读到下一个空格,所以当你以fscanf() "%d %s %d"的格式指定时,它会一直读到第三个空格,然后停止。您可以通过下面的代码中的方法解决此问题(阅读fscanf()的返回值),因为fscanf()如果使用下面的代码读取EOF,则返回fscanf() EOF继续逐行扫描文件,直至其显示为#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> struct studnt { int id; int number; char *name; }typedef s_studnt; void print_studnt(FILE *q,char name_file[]) { int id, number; char str_name[20]; q=fopen(name_file, "r"); if (q == NULL) { printf("eror fac\n"); return; } printf("\n"); int r; r=0; do { r = fscanf(q, "%d %s %d", &id, str_name, &number); if(r==EOF) break; printf("studnt name:%s\nthe id studnt:%d\ntelephon number:%d\n", str_name, id, number); printf("\n"); } while (r != EOF); fclose(q); return; } int main() { int size, i, length; char str[20], name_file[20]; FILE *q = NULL; s_studnt *studnt = NULL; printf("how much studnt you have:\n"); scanf("%d", &size); studnt = (s_studnt*)malloc(size * sizeof(s_studnt)); if (studnt == NULL) { printf("eror 1\n"); return 0; } printf("enter file name:\n"); scanf("%s", name_file); q = fopen(name_file, "w"); if (q == NULL) { printf("eror file\n"); return 0; } for (i = 0; i < size; i++) { printf("enter studnt name:\n"); scanf("%s", str); length = strlen(str); studnt[i].name = (char*)malloc(length+1 * sizeof(char)); if (studnt[i].name == NULL) { printf("eror2\n"); return 0; } strcpy(studnt[i].name, str); printf("enter the id studnt:\n"); scanf("%d", &studnt[i].id); printf("enter your telephon number:\n"); scanf("%d", &studnt[i].number); fprintf(q, "%d %s %d\n", studnt[i].id, studnt[i].name, studnt[i].number); } fclose(q); print_studnt(q,name_file); return 0; } 。使用 fscanf()逐行阅读文件不被视为良好做法(http://www.cplusplus.com/reference/cstdio/fscanf/

let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
if let textValue = textField.value {
    var amount = numberFormatter.number(from: textValue)
}