2016-12-02 34 views
-1

LetterNumber、LetterNumber、LetterNumberなどの値を持つ.txtファイルがあります(例:A1、C8、R43、A298、B4)。私は文字と数字を別々の2つの配列に読みたいと思う(例:array1はA C R A B、array 2は1 8 43 298 4)。どうすればそれを実現できますか?つを含む:私は2つの配列をしたいC - ファイルからintとcharを配列に読み込む

FILE *myfile; 
myfile = fopen("input1.txt", "r"); 
char input[677]; //I know there are 676 characters in my .txt file 
int i; 
if (myfile == NULL) { 
    printf("Error Reading File\n"); 
    exit (0); 
}  
for (i=0; i<677; i++) { 
    fscanf(myfile, "%c", &input[i]); 
} 
fclose(myfile); 

しかし、理想的に:私は文字の1列に、数字や文字、コンマ、すべての両方をすべての値を読み取る方法を考え出した瞬間

文字のみと数字だけを含むものです。それも可能ですか?

私は何らかのヒントがあれば助けていただきたいと思います。ありがとうございました!

+3

はい、可能です。 –

+0

'fscanf'を使って' getc() 'を使わないのはなぜでしょうか? – RoadRunner

+0

@RoadRunner scanfを使うのは、少なくとも常に1文字のときです。フォーマットは単に "%c%d"になります。そしてカンマを読んでください。 T.canの答えはそれをかなりカバーしています。 –

答えて

1

は整数の別の配列を定義し、forループで次に

int inputD[677]; 

は、一度に1つの文字、1つの整数と一つのスペース文字を読み取ります。

fscanf(myfile, " %c%d %*[,] ", &input[i], &inputD[i]); 
+0

カンマの文字列形式を使用することもできます。空白は%sの前に破棄されます。フォーマット全体がスペースで始まるので、空白もチャーを読む前に破棄されます。 –

0

あなたは基本的には、その後、1つのcharアレイと1つのint配列を作成し、ファイルストリームから値を読み取るためにfscanfを使用する必要があります。あなたはEOFまでfscanfから返さ2値を読み取ることができ、この場合、whileループを使用して簡単にするために

は、仕事が容易になります。このような

何かが正しい考えです:

#include <stdio.h> 
#include <stdlib.h> 

// Wasn't really sure what the buffer size should be, it's up to you. 
#define MAXSIZE 677 

int 
main(void) { 
    FILE *myFile; 
    char letters[MAXSIZE]; 
    int numbers[MAXSIZE], count = 0, i; 

    myFile = fopen("input1.txt", "r"); 
    if (myFile == NULL) { 
     fprintf(stderr, "%s\n", "Error reading file\n"); 
     exit(EXIT_FAILURE); 
    } 

    while (fscanf(myFile, " %c%d ,", &letters[count], &numbers[count]) == 2) { 
     count++; 
    } 

    for (i = 0; i < count; i++) { 
     printf("%c%d ", letters[i], numbers[i]); 
    } 
    printf("\n"); 

    fclose(myFile); 

    return 0; 
} 
+0

あなたのプログラムは "A2、B3"を解析していますか? –

+0

また、 "A2"でも問題ありません。 –

+0

ええ、それはその罰金を解析します。 – RoadRunner

1

私は実際にが一緒に文字と数字を維持するために構造体を定義します。データ形式は密接に関連していることを強く示唆しています。ここにそのアイデアを例示するプログラムがあります。

scanf形式は、多少なりともとなります(できるだけ単純ですが、単純ではありません)。たとえば、RoadRunnerは答えの手紙の前にある空白をスキップするのを忘れていました。

私たちは(私が仮定すると)ただ一つの手紙を持つのに役立ちます。 %cを除くすべての標準形式が空白をスキップすることを覚えておくと便利です。 (その文の両方の部分を忘れてはならない。)

#include<stdio.h> 

#define ARRLEN 10000 

// Keep pairs of data together in one struct. 
struct CharIntPair 
{ 
    char letter; 
    int number; 
}; 

// test data. various space configurations 
// char *data = " A1, B22 , C333,D4,E5 ,F6, Z12345"; 

void printParsedPairs(struct CharIntPair pairs[], int count) 
{ 
    printf("%d pairs:\n", count); 
    for(int i = 0; i<count; i++) 
    { 
     printf("Pair %6d. Letter: %-2c, number: %11d\n", i, pairs[i].letter, pairs[i].number); 
    } 
} 

int main() 
{ 
    setbuf(stdout, NULL); 
    setbuf(stdin, NULL); 

    // For the parsing results 
    struct CharIntPair pairs[ARRLEN]; 
    //char dummy [80]; 
    int parsedPairCount = 0; 
    for(parsedPairCount=0; parsedPairCount<ARRLEN; parsedPairCount++) 
    { 
     // The format explained> 
     // -- " ": skips any optional whitespace 
     // -- "%c": reads the next single character 
     // -- "%d": expects and reads a number after optional whitespace 
     // (the %d format, like all standard formats except %c, 
     // skips whitespace). 
     // -- " ": reads and discards optional whitespace 
     // -- ",": expects, reads and discards a comma. 
     // The position after this scanf returns with 2 will be 
     // before optional whitespace and the next letter-number pair. 
     int numRead 
      = scanf(" %c%d ,", 
        &pairs[parsedPairCount].letter, 
        &pairs[parsedPairCount].number); 

     //printf("scanf returned %d\n", numRead); 
     //printf("dummy was ->%s<-\n", dummy); 
     if(numRead < 0) // IO error or, more likely, EOF. Inspect errno to tell. 
     { 
      printf("scanf returned %d\n", numRead); 
      break; 
     } 
     else if(numRead == 0) 
     {   
      printf("scanf returned %d\n", numRead); 
      printf("Data format problem: No character? How weird is that...\n"); 
      break; 
     } 
     else if(numRead == 1) 
     { 
      printf("scanf returned %d\n", numRead); 
      printf("Data format problem: No number after first non-whitespace character ->%c<- (ASCII %d).\n", 
        pairs[parsedPairCount].letter, (int)pairs[parsedPairCount].letter); 
      break; 
     } 
     // It's 2; we have parsed a pair. 
     else 
     { 
      printf("Parsed pair %6d. Letter: %-2c, number: %11d\n", parsedPairCount, 
      pairs[parsedPairCount].letter, pairs[parsedPairCount].number); 
     } 
    } 
    printf("parsed pair count: %d\n", parsedPairCount); 
    printParsedPairs(pairs, parsedPairCount); 

} 
私は時々改行が発生しますWindowsの8%C上のbashとminttyと私のcygwinの環境と少し苦しんでいた

(ASCII 10)がすべき前の空白を食べる空間で食べさせて、構文解析を脱線させる。 (エラーが発生した後、エラーが発生した場合、次のコンマに遭遇するまでチャートを読み込み、そこから回復しようとする)

これはCtr-Dと入力したときに起こったコンソールウィンドウのCtr-Z)にEOFを通知しようと試みます。以下のEnterキーストロークは、改行が%cに到達するようにします。もちろん、Windowsシステム上のPOSIXエミュレーションにおけるテキストI/Oは難しいです。私は、CR-NLシーケンスの翻訳のどこかでこのバグが前後することを前提としています。ssh/puttyによるLinuxシステムでは、期待通りに動作します。

+0

この場合、構造体を使用すると良いでしょう。 – RoadRunner

関連する問題