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