Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何从.txt文件打印输入,并检查输入是否正确?_C_File_Scanf - Fatal编程技术网

C 如何从.txt文件打印输入,并检查输入是否正确?

C 如何从.txt文件打印输入,并检查输入是否正确?,c,file,scanf,C,File,Scanf,我有一些关于人的信息.txt文件。我需要用以下格式打印此信息。我是编程新手,所以我真的不知道如何正确使用fscanf()。我还要检查每个项目是否正确。例如,名称只能是char[40]类型,数字必须是可被11整除的整数,等等。如果输入不正确,程序将打印消息:“输入不正确:数字\n”。你能帮我吗? 文件: 预期产出: Name: James Novak Number: 9206110980 Diagnosis: D99 Date: 20190204 Name: Mary Novak Number:

我有一些关于人的信息.txt文件。我需要用以下格式打印此信息。我是编程新手,所以我真的不知道如何正确使用fscanf()。我还要检查每个项目是否正确。例如,名称只能是char[40]类型,数字必须是可被11整除的整数,等等。如果输入不正确,程序将打印消息:“输入不正确:数字\n”。你能帮我吗? 文件:

预期产出:

Name: James Novak
Number: 9206110980
Diagnosis: D99
Date: 20190204

Name: Mary Novak
Number: 7256235756
Diagnosis: B24
Date: 20190112
到目前为止,我只打印了文件

#include <stdio.h>

int main()
{
    FILE *f;
    char s[50];


    f=fopen("patients.txt","r");
    if (!f)
        return 1;
    while (fgets(s,50,f)!=NULL) 
    
    printf("%s",s); 
       
    fclose(f);
    return 0;
}
#包括
int main()
{
文件*f;
chars[50];
f=fopen(“patients.txt”,“r”);
如果(!f)
返回1;
while(fgets(s,50,f)!=NULL)
printf(“%s”,s);
fclose(f);
返回0;
}

我正在考虑使用循环来检查输入,但我还不知道如何做。

看起来您的输入文件分为四行:名称、编号、诊断、日期

你能相信吗?如果是这样,则不需要使用
fscanf()
。每个输入项都来自您文件中自己的行,因此您可以使用
fgets()
逐个读取这些行。它比
fscanf()
更容易使用。(这是未调试的。)

我本可以把重复的代码放到函数中,但我会把它留给你

而且,恕我直言,“C”并不是这类工作的最佳语言选择。它的文本字符串处理是(a)困难和(b)不安全的,也就是说,网络爬虫很容易攻击它。就个人而言,我永远不会使用C来处理其他人的医疗数据


Python可能是您更好的语言选择。

看起来您的输入文件分为四行:名称、编号、诊断、日期

你能相信吗?如果是这样,则不需要使用
fscanf()
。每个输入项都来自您文件中自己的行,因此您可以使用
fgets()
逐个读取这些行。它比
fscanf()
更容易使用。(这是未调试的。)

我本可以把重复的代码放到函数中,但我会把它留给你

而且,恕我直言,“C”并不是这类工作的最佳语言选择。它的文本字符串处理是(a)困难和(b)不安全的,也就是说,网络爬虫很容易攻击它。就个人而言,我永远不会使用C来处理其他人的医疗数据


Python可能是您更好的语言选择。

您是否编写代码逐行读取文件并显示其内容,而没有预期的格式?
fscanf()
不擅长处理格式错误的输入。您应该通过
fgets()
读取输入并自己解析它。检查输入格式是否正确后,
sscanf()
可能有助于将字符串转换为整数;我们期待着努力的证据,而不是仅仅为您编写代码。“如何从.txt文件使用fscanf打印并检查输入是否正确?”不是。您阅读整行代码,并显式地解析它们以确保正确性
scanf()
和family用于正确输入。请参阅欢迎使用堆栈溢出。这是一个新程序员提出的好问题。但是,不幸的是,答案打开了一个巨大的蠕虫罐头。你知道微软需要发布安全补丁的所有麻烦吗?很大一部分原因是因为他们的许多遗留系统代码使用C语言文本字符串处理,缓冲区很容易溢出。您是否编写代码来逐行读取文件并显示其内容,而没有预期的格式?
fscanf()
不擅长处理格式错误的输入。您应该通过
fgets()
读取输入并自己解析它。检查输入格式是否正确后,
sscanf()
可能有助于将字符串转换为整数;我们期待着努力的证据,而不是仅仅为您编写代码。“如何从.txt文件使用fscanf打印并检查输入是否正确?”不是。您阅读整行代码,并显式地解析它们以确保正确性
scanf()
和family用于正确输入。请参阅欢迎使用堆栈溢出。这是一个新程序员提出的好问题。但是,不幸的是,答案打开了一个巨大的蠕虫罐头。你知道微软需要发布安全补丁的所有麻烦吗?很大一部分原因是因为他们的很多遗留系统代码使用C语言文本字符串处理,缓冲区很容易溢出。谢谢,我想我明白了。不幸的是,我不得不使用C语言,因为我在高中,这要求我们只使用C语言。至于医疗数据,我只选择了这个作为例子,所以不会有什么不好的事情发生:)哦,好的。我明白了。这个老家伙很久以前就不得不使用C,因为它就是那样或FORTRAN。尽管如此,C文本字符串处理仍然是令人讨厌和易受攻击的。我已经烧了很多次了。你自己试试。。。。在文件中放入一行2000个字符的文本,看看会发生什么。(按住键盘上的一个键)谢谢,我想我明白了。不幸的是,我不得不使用C语言,因为我在高中,这要求我们只使用C语言。至于医疗数据,我只选择了这个作为例子,所以不会有什么不好的事情发生:)哦,好的。我明白了。这个老家伙很久以前就不得不使用C,因为它就是那样或FORTRAN。尽管如此,C文本字符串处理仍然是令人讨厌和易受攻击的。我已经烧了很多次了。你自己试试。。。。在文件中放入一行2000个字符的文本,看看会发生什么。(按住键盘上的一个键。)
#include <stdio.h>

int main()
{
    FILE *f;
    char s[50];


    f=fopen("patients.txt","r");
    if (!f)
        return 1;
    while (fgets(s,50,f)!=NULL) 
    
    printf("%s",s); 
       
    fclose(f);
    return 0;
}
int bufferLength = 1024; /* defend against unexpectedly long lines */
char buffer [bufferLength + 1];
int number = 0;
/* open the file */
FILE* filePointer;
filePointer = fopen("file.txt", "r");

while (1) {  /* repeat until break */
    if (!fgets(buffer, bufferLength, filePointer)) break;
    /* Remove any trailing newline-type characters */
    buffer[strcspn(buffer, "\r\n")] = 0;
    if (strlen(buffer) > 40) printf("Name too long.\n");
    printf ("Name: %s\n", buffer);   

    if (!fgets(buffer, bufferLength, filePointer)) break;
    buffer[strcspn(buffer, "\r\n")] = 0;
    number = atoi(buffer);
    if (number == 0) printf("bad number: %s", buffer);
    printf ("Number: %s\n", buffer);   

    if (!fgets(buffer, bufferLength, filePointer)) break;
    buffer[strcspn(buffer, "\r\n")] = 0;
    printf ("Diagnosis: %s\n", buffer);   

    if (!fgets(buffer, bufferLength, filePointer)) break;
    buffer[strcspn(buffer, "\r\n")] = 0;
    printf ("Date: %s\n", buffer);   
}
fclose(filePointer);