【解決方法】こんにちは! C で CSV ファイルをインポートする際に問題が発生します。

プログラミングQA


CSV ファイルを C プログラムにインポートし、後でそれを使用してタスクを実行したいと考えています。 残念ながら、インポート中にエラーが発生したようです。機能しません。 理解しやすいようにプログラムを英語に翻訳し、CSV ファイルを添付しました。
GitHub – 420ベラ/時: hfff[^]

ファイルを更新しました。

私が試したこと:

コードを何度か読んでエラーを見つけようとしました

解決策 1

プログラムは while ループでクラッシュしますが、ポインターの最後の値が NULL であるため、これは驚くべきことではありません。

C
Questions *last = NULL;  // Pointer to the last element

while (fscanf(file, "%d,%99[^,],%19[^,],%19[^,],%19[^,],%19[^,],%c,%9[^,\n]\n",
       &(last->difficulty), last->question, 
       last->optionA, last->optionB, last->optionC, last->optionD, 
       &(last->answer), last->category) == 8) {

最初に fgets で完全な行を読み取り、次に strtok() で列を検索する方が良いかもしれません。 これには、静的なテキストの長さを扱う必要がないため、より安全で柔軟になるという利点があります。

// 編集1:
csv ファイルには、ハンガリー語の特殊文字が含まれています。 おそらく、これらを文字として読み取るのは困難です。 wchar_t をお勧めします。 オペレーティング システムとコンパイラによっては、他にも考慮すべき点があります。
また、デバッガーを使用するとエラーの場所を特定するのが非常に簡単であることも指摘しておきます。
有意義な回答を可能にするために、オペレーティング システムとコンパイラに関する詳細情報も提供してください。
C++も選択肢になるのでしょうか?

// 編集2:
CSV を読み取ると次のようになります (一部のエラー メッセージが欠落しています)。

C
// prototypes
void appendQuestion(Questions** head, Questions* newQuestion);
void readCSV(Questions** head, const char* filename);
void freeQuestions(Questions* head);

void readCSV(Questions** head, const char* filename)
{
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        perror("Error: Failed to open the file.\n");
        return;
    }

    wchar_t line[MAX_LINE_LENGTH];
    wchar_t delim[] = L";\n";  // Define delimiters
    wchar_t *token, *context=NULL;

    fgetws(line, sizeof(line), file); // skip header

    // Read each line of the CSV file
    while (fgetws(line, MAX_LINE_LENGTH, file) != NULL)
    {
        // create new question
        Questions* last = (Questions*)malloc(sizeof(Questions));  
        last->next = NULL;

        token = wcstok(line, delim, &context); 
        if (!token) break;
 
        last->difficulty = _wtoi(token);    // 1. column

        token = wcstok(NULL, delim, &context);
        if (!token) break;

        wcsncpy(last->question, token, sizeof(last->question)/sizeof(wchar_t)-1);  // 2. column

        ...

    appendQuestion(head, last);    // append question to the list
    } // eof while

    fclose(file);
}

コメント

タイトルとURLをコピーしました