2016-05-02 42 views
-1

私はスタックエクスチェンジを全面的に行ってきましたが、私の質問に答えるスレッドはありませんでしたが、私がそれを逃した場合は、私に指示してください。テキストファイルから文字列のポインタ配列に行を読み込みます。

私は、これらのラベルに対応したデータの9枚になった後だから私は最初の9行は(スペースを含む)ラベルされているテキストファイル、および各ラインを持っているC.

を使用しています。私は、ポインタの配列を宣言した:

char * cp_labels[9]; 

そして私は、配列の各要素にテキストファイルから最初の9本のラインのそれぞれを読みしようとしています。

テキストファイルは、次のようになりますように

Et jet 1 
Et jet 2 
Et jet 3 
Eta 1 
Eta 2 
Eta 3 
Met 
Ht 
Njet 
(double) (double) (double) (double) (double) (double) (double) (double) (double) 
(double) (double) (double) (double) (double) (double) (double) (double) (double) 
(double) (double) (double) (double) (double) (double) (double) (double) (double) 
... 

とします。今は、文字列が配列に正しく格納されていることを確認しようとしています。私はに実行している問題が

fscanf 

が文字列(それが必要のように)として、各文字列を処理していると私はそれを取得しようとしているということです

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

int main() 
{ 
    FILE *fp_data; 
    fp_data = fopen("data.dat", "r"); 
    char *cp_labels[9]; 

    for (int l=0;l<9;l++) 
    { 
     fscanf(fp_data, "%s", cp_labels[l]); 

     printf("%s\n", cp_labels[1]); 
    } 

    return 0; 
} 

:私はこれで働いています各行を文字列として扱います。

fgets 

私が気づいているオプションですが、文字列のポインタ配列で動作させることはできません。何か案は?後でラベルとしてこの配列の要素を使用できるようにしたいので、私はこのようにしています。

+2

これらのポインタに割り当てられたデータを読み込むためのスペースが必要です。また、 'fscanf()'ではなく 'fgets()'を使う必要があります。あなたは['getline()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html) がオプションであるLinuxまたはPOSIX-ishマシンにいますか?そうなら、それを使用してください。それに失敗すると、最初の行は常にかなり短いですか?もしそうなら、行を固定サイズのバッファに読み込んだり、 'strdup()'を使ってポインタをポイントするために割り当てられたスペースにそれらをコピーすることができます。 –

+0

「fgets」を働かせることができないということはどういう意味ですか?構文に関する問題や論理に関する問題はありますか? – paddy

+1

各 'cp_labels [i]'ポインタは読み込む前に割り当てなければなりません。それ以外の場合、 'fscanf'は無効なバッファポインタを読み込もうとします。 'cp_labels'は最初は未定義のアドレス/ポインタの配列です。 – lurker

答えて

0

このコードでは、仕事をしていません。(データファイルから)

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

int main(void) 
{ 
    const char filename[] = "data.dat"; 
    FILE *fp = fopen(filename, "r"); 
    if (fp == 0) 
    { 
     fprintf(stderr, "Failed to open file %s for reading\n", filename); 
     return 1; 
    } 

    char *cp_labels[9]; 
    char buffer[4096]; 

    for (int i = 0; i < 9 && fgets(buffer, sizeof(buffer), fp) != 0; i++) 
    { 
     buffer[strcspn(buffer, "\n")] = '\0'; 
     cp_labels[i] = strdup(buffer); 
    } 

    for (int i = 0; i < 9; i++) 
     printf("%d: [%s]\n", i, cp_labels[i]); 

    for (int i = 0; i < 9; i++) 
     free(cp_labels[i]); 

    fclose(fp); 
    return 0; 
} 

出力例:使用して権利を取得するのは簡単ですので

0: [Et jet 1] 
1: [Et jet 2] 
2: [Et jet 3] 
3: [Eta 1] 
4: [Eta 2] 
5: [Eta 3] 
6: [Met] 
7: [Ht] 
8: [Njet] 

これはfgets()を使用しています。 getline()を使用すると同じように簡単です:

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

int main(void) 
{ 
    const char filename[] = "data.dat"; 
    FILE *fp = fopen(filename, "r"); 
    if (fp == 0) 
    { 
     fprintf(stderr, "Failed to open file %s for reading\n", filename); 
     return 1; 
    } 

    char *cp_labels[9]; 
    char *buffer = 0; 
    size_t buflen = 0; 

    for (int i = 0; i < 9 && getline(&buffer, &buflen, fp) != -1; i++) 
    { 
     buffer[strcspn(buffer, "\n")] = '\0'; 
     cp_labels[i] = buffer; 
     buffer = 0; 
     buflen = 0; 
    } 
    free(buffer); 

    for (int i = 0; i < 9; i++) 
     printf("%d: [%s]\n", i, cp_labels[i]); 

    for (int i = 0; i < 9; i++) 
     free(cp_labels[i]); 

    fclose(fp); 
    return 0; 
} 

これは同じ出力を生成します。

関連する問題