- ベストアンサー
なぜ動かないのかわからないです。
以下のことをしようと思いました。 (1)テキストファイルを読み込む (2)文字列を半角全角を区別しないで済むワイド文字列に変換する (3)デバッグとして、各配列に格納された文字列、文字数、を表示させる この(1)~(3)を行うために以下のようなプログラムを組んでみました。 // ファイルを読み込む #include <stdio.h> #include <string.h> #include <stdlib.h> #include <locale.h> #define LineMax 30000 int main(void){ char FileName[] = "ReadFile.txt"; wchar_t *FileContents[LineMax]; // ワイド文字列格納用配列 char buff[512]; // ファイル読み込み一時領域 int i, buffstrLen; int FileLineNo = 0; int FileContentsCharCount[LineMax]; FILE *fp; // Cロケールカら地域ロケールに変換 setlocale(LC_ALL, "Japanese"); // ファイルを読み込む fp = fopen(FileName, "r"); if(fp == NULL){ printf("\"%s\"ファイルの読み込みに失敗しました。\n", FileName); exit(1); } // 一行ずつファイルを変数に格納していく // 無限ループ(ファイルの最後まで) while(1){ // ファイルから一行読み込み if(fgets(buff, 512, fp) == NULL){ break; } // 一行の長さを計算する(バイト数) buffstrLen = strlen(buff); // 領域を確保 FileContents[FileLineNo] = (unsigned short *)malloc(buffstrLen); if(FileContents[FileLineNo] = NULL){ puts("領域の確保に失敗しました。"); exit(1); } // ■間違い?■ワイド文字にした上で、FileContentsポインタ配列に格納する FileContentsCharCount[FileLineNo] = mbstowcs(FileContents[FileLineNo], buff, buffstrLen); FileLineNo++; } fclose(fp); /***** ファイル読み込み完了 *****/ FileLineNo--; printf("ファイルには%d行ありました\n", FileLineNo); for(i=0; i<FileLineNo; i++){ // i 行目の文字数 printf("DEBUG:FileContents[%03d]の文字数%d文字\n", i, FileContentsCharCount[i]); // i 行目の文字内容 printf("DEBUG:FileContents[%03d]の内容:%s\n", i, FileContents[i]); } return 0; } ■間違い?■で示した部分でFileContents[FileLineNo]の中に、buff配列に一時的に格納した文字列が入っていないように思いました。 文字数は、バイト数ではなく、全角半角区別なく単純な文字数として表示されるのに、読み込み内容が全く表示されないのです(すべて(null)) 無駄な領域をなくすために、毎回バイト数を計算し、その都度mallocで領域を取得して、そこの領域にコピーしているはずなのに… 私の現在の知識量では、解決する策が全く思いつかなかったので、どなたか詳しい方助けてください。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
お礼
m(_ _)mありがとうございました。