0

文字列の後に数字が続くテキストファイルを読み込んで、その内容を保存しようとしています。これまでのところ、適切にフォーマットされている場合は、文字列のみ (または int のみ、またはその両方) を出力することしかできません。空白行または形式が正しくない行 (現在前の行を複製している行) をスキップして、結果を保存するにはどうすればよいですか?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"

#define MAX_LINE_LENGTH 400

int main ()
{
    char input[MAX_LINE_LENGTH];
    char name[MAX_LINE_LENGTH];
    int number;

    FILE *fr;
    fr = fopen ("updates.txt", "r");
    if (!fr)
    return 1;  
    while (fgets(input,MAX_LINE_LENGTH, fr)!=NULL)
    {
        /* get a line, up to 200 chars from fr.  done if NULL */
        sscanf (input, "%s", name);
        /* convert the string to just a string */
        printf ("%s\n", name);
    }
    fclose(fr);
    return 0;
}

サンプル テキスト ファイル

寒い 5
10 炎

わんわん4

フレイムス 11
コールド 6
4

3 に答える 3

2

fscanf 関数を使用できます。フォーマット文字列に空白スペースがあると、スペース、タブ、または改行が無視されます。

于 2013-11-14T08:03:41.657 に答える
0

問題の考えられる解決策は、以下のコードにあります。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"

#define MAX_LINE_LENGTH 400

int main ()
{
    char input[MAX_LINE_LENGTH];
    char name[MAX_LINE_LENGTH];
    char namet[MAX_LINE_LENGTH];
    int number;

    FILE *fr;
    fr = fopen ("updates.txt", "r");
    if (!fr)
    return 1;
    while (fgets(input,MAX_LINE_LENGTH, fr)!=NULL)
    {
        memset(name, 0, MAX_LINE_LENGTH);
        memset(namet, 0, MAX_LINE_LENGTH);
        /* get a line, up to 200 chars from fr.  done if NULL */
        //sscanf (input, "%s %d", name, &number);
        sscanf (input, "%s %s", name, namet);

        // TODO: compare here for name shall only contain letters A-Z/a-z
        // TODO: compare here for namet shall only contain digits

        // If both above condition true then go ahead
        number = atoi(namet);

        if(name[0] != '\0')
        {
                /* convert the string to just a string */
                printf ("%s %d\n", name, number);
                //printf ("%s %s\n", name, namet);
        }
    }
    fclose(fr);
    return 0;
}
于 2013-11-14T07:55:35.413 に答える