0

申し分なく、私は一日中これに取り組んでいましたが、私の人生でこれを理解することはできません。多分あなたが助けてくれるでしょう。次のようなファイルがあります

1301,105515018,"Boatswain","Michael R.",ABC, 123,="R01"

1301,103993269,"カスティーリャ","マイケル Jr",ABC, 123,="R03"

1301,103993267,"カスティーユ","ジャニス",ABC, 123,="R03"

1301,104727546,"ボンチェック","クロード",ABC, 123,="R01"

1301,104731479,"クルス","アキーム マイク",ABC, 123,="R01"

1301,105415888,"デジコモ","スティーブン",ABC, 123,="R02"

1301,106034479,"アニット グラシス","スーザン",ABC, 123,="R04"

1301,106034459,"Als","Christian",ABC, 123,="R01"

そして、ここに私のコードがあります...

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

#define MAX_NAME 15
#define MAX_SUBSEC 3
#define N 128

//void printArr(struct *students);

struct student{

int term;
int id;
char lastname[MAX_NAME];
char firstname[MAX_NAME];
char subjectname[MAX_SUBSEC];
int catalog;
char section[MAX_SUBSEC];

}students[10];

int main(){

int term;
int id;
char lastname[MAX_NAME];
char firstname[MAX_NAME];
char sub[MAX_SUBSEC];
int cat;
char sec[MAX_SUBSEC];

char fname[N];
FILE *inputf;

printf("Enter the name of the text file: ");
scanf("%123s",fname);

strcat(fname,".txt");

inputf = fopen(fname,"r");

if (inputf == NULL){

     printf("I couldn't open the file for reading.\n");
     exit(0);

}
//TROUBLE HERE!

fscanf(inputf, "%d,%d,%[^,]s", &students[0].term, &students[0].id,students[0].lastname);

printf("%d\n", students[0].term);

printf("%d\n", students[0].id);

printf("%s\n", students[0].lastname);

/*for (j = 1 ; j <= 10-1 ; j++){

    for(k = 0 ; k <= 10-2 ; k++){

        if(students[k] > students[k+1]){

            temp = students[k];
            students[k] = students[k+1];
            students[k+1] = temp;

            }
        }
    }*/

fclose(inputf);

system("pause");

return 0;

}

void printArr(int a[], int tally){

int i;

for(i = 0 ; i < tally ; i++){

 printf("%d ", a[i]);

}

printf("\n");

}

私の目的は、テキスト ファイル内のこれらの値のそれぞれを取得し、それを構造体の所属する場所に入力し、続いて構造体配列に入力することですが、最初の 2 つの int を渡すことができません。

姓の文字列を取得すると、最大 15 文字であるため、その直後に名の文字列にスピルオーバーし、姓の文字配列を埋めるために必要な残りの文字を取得します。明らかに私はこれを望んでいません。ご覧のとおり、strtok を試してみましたが、何もしません。これまで使用したことがないため、何をしなければならないかわかりません。また、すべての変数を fscanf ステートメントに含めてみましたが、同じ出力が得られるか、混乱します。現状では、私は非常に迷っています.これらの値を、それらが属する変数にどのように取得しますか?!

編集:コードを更新しました。少し先に進みましたが、それほど多くはありません。姓だけを印刷できるようになりましたが、そこから遠く離れることはできません。姓の文字列またはそれを超える変数には到達できません。

4

5 に答える 5

2

引用符で囲まれた文字列を含むCSVファイルがあるので、すべてを実行しようとするのではなく、CSVパーサーを使用する(または独自にロールする)ことをお勧めしますscanfscanf引用符で囲まれた文字列内のコンマなど、引用符を処理できないため)。Googleですばやく検索すると、プロジェクトで使用できる可能性のあるlibcs​​v.cが見つかります。

于 2013-03-01T03:08:09.667 に答える
2

fscanfフォーマット文字列を使用"%d,%d,\"%[^\"]\",\"%[^\"]\",%[^,],%d,=\"%[^\"]\""すると、行全体のデータを読み取ることができます。さらに、定義する必要があります

char lastname[MAX_NAME+1];
char firstname[MAX_NAME+1];
char subjectname[MAX_SUBSEC+1];
int catalog;
char section[MAX_SUBSEC+1];

+1終端の '\0' 文字を考慮します。

于 2014-06-04T07:25:53.670 に答える
1

あなたに質問があります... ダイヤモンドカッターの使い方を知りたければ、実際に使ってみますか、それとも説明書を見ますか? ここでの問題は、あなたの選択の結果ではなく、あなたの選択そのものです。信じられないかもしれませんが、私はこれらの質問に何度も答えてきたので、繰り返すのにうんざりしています。答えはすべてマニュアルにあります。

POSIX 2004scanfマニュアル(またはPOSIX 2008/2013 バージョン)を読み、この質問に答えてください。そうすれば、何をすべきで何をしていないかがわかります。fscanf読み取ったアイテムの数が正しいことを確認するために、コードでもassertデバッグ支援として使用する必要があります。

%[^,]sここに間違いがあるようです。おそらくあなたが意味し%[^,]た。%[フォーマット指定子は、フォーマット指定子とは異なるフォーマット指定子%sであるため、おそらく間違ったコードには と の 2 つのディレクティブが%[^,]ありsます。sディレクティブはscanf、「s」を読み取って破棄するように指示します。

于 2013-03-01T03:15:24.837 に答える
0

1.構文エラーがあります

while(result != NULL){

      printf(".....);

      ......

}

}//error
  1. fscanf(inputf, "%s", lastname); 行を読むことができませんfscanf。スペースに出くわすと停止します
于 2013-03-01T03:04:43.307 に答える
0

fscanf は一度に 1 行ずつ読み取ります。特にコンマ区切りにより、ファイルが適切にフォーマットされているため、各行の内容を簡単にキャプチャできます (区切り値にコンマが含まれていない場合は非常に便利です)。

fscanf には、"%d" を使用して int をキャプチャする、"%s" を使用して文字列をキャプチャするなどの形式を渡すことができます (空白で終了します。たとえば、"Annitto のような名前を見つけようとするときは、これにうんざりしてください)現在読み取られているファイルの行から 2 つの %s などを必要とする Grassis より高度な方法で、正規表現パターンを使用して、文字で構成されるシーケンスである「Boatswain」などの文字としてキャプチャする内容を定義できます。セット {AZ}、{az}、および {"} から。最後に到達するまでファイルをスキャンし (C では EOF で示されます)、そのようにして行の内容をキャプチャし、次のように値を変数に適切に割り当てることができます。

while( fscanf(inputf, "%d,%d,%[\"A-Za-z ],%[\"A-Za-z .]", &term, &id, lastname, firstname) != EOF) {

.... // term、id、lastname、firstname で何かを行います - それらを学生の構造体に入れます

}

正規表現の詳細については、Jeff Friedl によるMastering Regexがこのトピックについて学ぶのに適した本です。

于 2013-03-01T04:55:39.263 に答える