【问题标题】:How do I print inpuits from .txt file with checking if the inputs are correct?如何打印 .text 文件中的输入并检查输入是否正确?
【发布时间】:2024-01-07 03:19:01
【问题描述】:

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

James Novak
6608133268
D99
20190204

Mary Novak
0256157704
B24
20190112

预期输出:

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;
}

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

【问题讨论】:

  • 您是否编写了代码来读取文件并逐行显示其内容,而没有预期的格式?
  • fscanf() 不擅长处理格式错误的输入。您应该通过fgets() 读取输入并自行解析。检查输入格式是否正确后,sscanf() 可能有助于将字符串转换为整数。
  • 请展示您尝试过的内容;期望有努力的证据,而不是期望 SO 只是为您编写代码。
  • "如何使用 .txt 文件中的 fscanf 打印并检查输入是否正确?"不是。您阅读整行并明确解析它们以确保正确性。 scanf() 和家人是为了正确输入。见sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html
  • 欢迎来到 Stack Overflow。这是一个新程序员提出的一个好问题。但是,不幸的是,答案打开了一大堆蠕虫。你知道微软需要发布安全补丁的所有麻烦吗?其中很大一部分是因为他们的许多遗留系统代码使用 C 语言文本字符串处理,其中缓冲区溢出很容易。

标签: c file scanf


【解决方案1】:

看起来您的输入文件是由四行组成的块:姓名、编号、诊断、日期。

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

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);

我本可以将重复的代码放入一个函数中,但我会把它留给你。

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

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

【讨论】:

  • 谢谢,我想我明白了。不幸的是,我必须使用 C 语言,因为我在高中,这要求我们只使用 C 语言。至于医疗保健数据,我只选择了这个,所以不会有任何不好的事情发生:)
  • 哦,好的。我知道了。这个老家伙很久以前不得不使用C,因为它是那个或FORTRAN。尽管如此,C 文本字符串处理仍然是令人讨厌且易受攻击的。我已经烧过自己很多次了。自己尝试一下....将一行包含 2000 个字符的文本放入您的文件中,看看会发生什么。 (按住键盘上的一个键。)