从给定的 txt 中读取所有数字并将它们输出到 c 中的新文件中

Posted

技术标签:

【中文标题】从给定的 txt 中读取所有数字并将它们输出到 c 中的新文件中【英文标题】:Read all Numbers from a given txt and output them in a new file in c 【发布时间】:2022-01-11 00:59:25 【问题描述】:

我对 *** 很陌生,因此如果它不符合我的要求,我很抱歉。我的问题是,如何从给定的 txt 文件(我的代码中的 finp)中读取所有数字并将它们输出到一个新文件中。我做了我所知道的一切,但不知何故我无法找到一个解决方案来读出所有数字。我可以输出它们,但如上所述,它不等于文本文件中的数字。我希望这里有人可以帮助我。泰 (我确实设法输出了 txt 中的所有字母,但这些数字让我的生活变得艰难......)

【问题讨论】:

int numbers[0]; 不应该编译。那是numbers[100] 还是什么? 我确实在那里做错了,不要介意那些变量,因为我尝试了一些东西,基本上我需要的是一个读取所有数字的代码,我不知道我该如何解决这个问题。 fprintf(foutp, "\nVorkommenden Zahlen und ihre Häufigkeit sind:\n"); for (int i=0; i 你的代码至少应该编译和打印一些东西。您还必须显示输入、输出和预期输出,并请说明您遇到的具体问题。 如前所述,我的问题是,我需要在输入的特定文本文件中输出所有数字。我已经完成了所有字母的输出,这是有效的,但是我不知道如何从我给出的 txt 文件中输出或读取数字。 【参考方案1】:

除了您的“数字”数组没有大小(应该至少为 10)这一事实之外,您在读取文本文件时没有收集任何有关数字的信息。您只收集有关信件的信息。

while (*curr != '\0') 
    if (*curr >= 'A' && *curr <= 'Z') 
        alphabet[*curr-'A']++;
     else if (*curr >= 'a' && *curr <= 'z') 
        alphabet[*curr-'a']++;
    

我会这样写那部分:

while(*curr != '\0')

    if(isupper(*curr)
        alphabet[*curr - 'A']++;
    else if(islower(*curr)
        alphabet[*curr - 'a']++;
    else if(isdigit(*curr))
        numbers[*curr - '0']++;       

现在我已经下载了您的程序并对其进行了编辑。我正在向您发送我的更改。现在可以编译源代码并且也可以使用数字。您可能必须根据自己的需要对其进行调整。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define TEXT_STATS "text_stats.txt"     // Ausgabe in die gewünschte Datei
#define MAX_STRG 100                   // Länge String - Maximum
#define MAX_LINE 100                  // Länge Line - Maximum

int main (void)


    char input[MAX_STRG], read[MAX_LINE];
    int x = 0, lines = 0, alphabet[26] = 0, numbers[10] = 0;
    size_t newline = 0;

    while (1) 
        printf("Hier Namen der Datei oder den Pfad eingeben: ");
        if (fgets(input, MAX_STRG, stdin) == NULL) 
            continue;
        
        newline = 0;
        while (input[newline] != '\0' && input[newline] != '\n' && newline < (int)sizeof(input))
            newline++;
        if (newline == 0) 
            continue;
        

        if (newline >= (MAX_STRG-1)) 
            while (getchar() != '\n');
            fprintf(stderr, "Maximum length is %d\n", MAX_STRG);
            continue;
        
        input[newline] = '\0';
        break;
    

    FILE *finp = fopen(input, "r");
    if (finp == NULL) 
        fprintf(stderr, "Datei kann nicht geöffnet oder gefunden werden!\n");
        return 0;
    

    while (fgets(read, MAX_LINE, finp) != NULL) 
        char *curr = read;

        size_t newline = 0;
        while (curr[newline] != '\0' && curr[newline] != '\n' && newline < MAX_LINE)
            newline++;
        if (newline < (MAX_LINE-1)) 
            lines++;
        
        curr[newline] = '\0';

        while (*curr != '\0') 
            if (isupper(*curr))
                alphabet[*curr-'A']++;
            else if (islower(*curr))
                alphabet[*curr-'a']++;
            else if (isdigit(*curr))
                numbers[*curr - '0']++;
            x++;
            curr++;
        
    

    FILE *foutp = fopen(TEXT_STATS, "w");
    if (foutp == NULL) 
        fprintf(stderr, "Datei kann nicht geöffnet oder gefunden werden!\n");
        return 0;
    

    fprintf(foutp, "Statistic for the text file \"%s\":\n", input);
    fprintf(foutp, "== A total of %d characters in %d lines ==\n", x, lines);
    fprintf(foutp, "\nLetters:\n");
    
        int Len = sizeof(alphabet) / sizeof(int);
        int cols = 4, rows = (Len / cols) + ((Len % cols) ? 1 : 0);
        typedef int (*biar)[rows];
        biar iPtr = (biar)alphabet;
        for(int j = 0, k = 0, pos = 0; (cols * j) < Len; j++)
        
            for(k = 0, pos = (rows * k) + j; pos < Len; pos = (rows * ++k) + j)
                fprintf(foutp, "%c: %3d    ", pos + 'a', iPtr[k][j]);
            fprintf(foutp, "\n");
        
    
    fprintf(foutp, "\nNumbers:\n");
    
        int Len = sizeof(numbers) / sizeof(int);
        int cols = 4, rows = (Len / cols) + ((Len % cols) ? 1 : 0);
        typedef int (*biar)[rows];
        biar iPtr = (biar)numbers;
        for(int j = 0, k = 0, pos = 0; (cols * j) < Len; j++)
        
            for(k = 0, pos = (rows * k) + j; pos < Len; pos = (rows * ++k) + j)
                fprintf(foutp, "%c: %3d    ", pos + '0', iPtr[k][j]);
            fprintf(foutp, "\n");
        
    

    fprintf(foutp, "\nVorkommenden Zahlen und ihre Häufigkeit sind:\n");
    printf("Die gewünschte Aufstellung wurde in %s gespeichert!\n", TEXT_STATS);
    fclose(finp);
    fclose(foutp);
    return 0;

【讨论】:

您能告诉我如何收集这些数字的数据吗? 我改变了答案。请记住为“数字”提供大小,并且您也需要包含 ctype.h。 我用你的解决方案编辑了代码,现在它在写入输入文件的路径后不会做任何事情。 我又改了答案。

以上是关于从给定的 txt 中读取所有数字并将它们输出到 c 中的新文件中的主要内容,如果未能解决你的问题,请参考以下文章

如何从 txt 文件中读取特定的单词和数字并将它们保存在矩阵中

从C中的文件中读取行和列

从文件中读取行并将它们分成两个数字并执行计算并将它们写入文件c ++

如果字符串和数字在同一行,是否可以读取它们(从TXT文件中)。

我想读取带有数字的外部文件并将它们复制到列表中。 Python [重复]

从String中提取数字并将其保存到数组中