[解決済み] C言語でのパース方法【終了しました
2022-03-11 22:27:13
質問
私のアイデアは、ファイルからのデータを複数の変数に保存することです。このファイルは次のような構造になっています。
Cat;Small;Animal
Dog;Big;Animal
Tea;Warm;Drink
そのためには、';'と' \n'でテキストを分割する必要があるんだ。
そして、この例のように、このデータを配列に保存したいのです。
char object[3] = {"Cat", "Dog", "Tea"};
char description[3] = {"Small", "Big", "Warm"};
char type[3] = {"Animal", "Animal", "Drink"};
ありがとうございました。
解決方法は?
ファイルから行を読み込む関数で、例えば
get_line
(POSIX)、または
このポータブル
read_line
機能
を使えば、行をトークンに分割することができます。
strtok
で、デリミタが
";"
(を削除してください。
\n
という行があります。) その後、各トークンを関連する配列にコピーします。
しかし、ファイル形式が基本的にCSVファイルであり、将来的に列や行を増やしたくなるかもしれないので、次のような方法をとることができます。
libcsv
(
ドキュメンテーション
).
これを手っ取り早く解決するには、次のような方法があります。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern size_t read_line(FILE *file, char **line);
typedef enum Category {
OBJECT, DESCRIPTION, TYPE
} Category;
Category next_category(const Category category)
{
return (Category) ((category + 1) % 3);
}
int main(void)
{
char *object[3];
char *description[3];
char *type[3];
size_t counter = 0;
FILE *file = fopen("example.csv", "r");
char *line = NULL;
size_t length = 0;
while ((length = read_line(file, &line)) > 0 && counter < sizeof(object)) {
Category token_category = 0;
char *next_token = strtok(line, ";");
while (next_token != NULL) {
size_t token_length = strlen(next_token);
switch (token_category) {
case OBJECT:
object[counter] = calloc(token_length, sizeof(char));
memcpy(object[counter], next_token, token_length);
break;
case DESCRIPTION:
description[counter] = calloc(token_length, sizeof(char));
memcpy(description[counter], next_token, token_length);
break;
case TYPE:
type[counter] = calloc(token_length, sizeof(char));
memcpy(type[counter], next_token, token_length);
break;
}
// Read the next token from the same string
next_token = strtok(NULL, ";");
token_category = next_category(token_category);
}
free(next_token);
free(line);
++counter;
}
fclose(file);
printf("Objects: %s, %s, %s\n", object[0], object[1], object[2]);
printf("Descriptions: %s, %s, %s\n", description[0], description[1], description[2]);
printf("Types: %s, %s, %s\n", type[0], type[1], type[2]);
return 0;
}
関連
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] リストを均等な大きさの塊に分割するには?
-
[解決済み] 文字列をfloatやintにパースするにはどうしたらいいですか?
-
[解決済み] Bashで文字列をデリミターで分割するには?
-
[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
-
[解決済み] Javaで文字列を分割する方法
-
[解決済み】なぜPythonはこのJSONデータをパースできないのですか?[終了] PythonがこのJSONデータをパースできないのはなぜですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】「無効なイニシャライザー」と表示されるのですが、何が間違っているのでしょうか?
-
[解決済み】Cygwin - Makefile-error: ターゲット `main.o' のレシピに失敗しました。
-
[解決済み] テスト
-
[解決済み】LinuxのI_PUSHに相当するもの
-
[解決済み】C言語で入力が整数型かどうかチェックする
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】警告:式の結果が未使用の場合
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。
-
[解決済み】シンプルなC言語のscanfが機能しない?重複