S117のプロフィール
- ベストアンサー数
- 18
- ベストアンサー率
- 40%
- お礼率
- 100%
- 登録日2007/12/26
- なぜ動かないのかわからないです。
以下のことをしようと思いました。 (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で領域を取得して、そこの領域にコピーしているはずなのに… 私の現在の知識量では、解決する策が全く思いつかなかったので、どなたか詳しい方助けてください。 よろしくお願いします。
- ベストアンサー
- inada_star
- C・C++・C#
- 回答数3
- defineで定数が置き換えられない?(C言語)
#defineについて質問です。 #defineは、ソースコード内にこの文字を見つけたら、コンパイルする前にこの文字をこの定数に置き換えて、というプリプロセッサですよね?だから、printfで#defineで定義した定数を出力する場合で、変換指定が必要ない場合は #include <stdio.h> #define DEF 100 void main(){ printf("#defineで定義された定数はDEFです"); } でもいいと思うんです。ですがこのソースコードは間違いで、実行結果は #defineで定義された定数はDEFです(←置き換えられてない) となってしまします。プリプロセッサだけ実行しても、DEFは100に置き換えられずそのままです。printfで#defineで定義した定数を出力させたい場合は書式指定をしなければなりません。なぜ、このような場合は#defineで定義した定数は置き換えられないのでしょうか?回答よろしくお願いします。
- ベストアンサー
- noname#113783
- C・C++・C#
- 回答数5
- ポインタの問題です
学校の課題である文字列をポインタを使って逆順に表示するというプログラムを作ったのですが、「問題で引数で与えられた文字列を逆順とする関数を作成せよ.ただし文字数が最大256文字であると仮定して良い.」ということなんですが、課題が求めている答えと自分が作ったプログラムがあっているか確認お願いします。 #include <stdio.h> void reverseWord(char *str); void main(void) { char *str = "sapporo"; char *p, *q; printf("元: %s\n", str); p = q = str; while (*q != '\0') q++; printf("逆順:"); while (q >= p) putchar(*q--); printf("\n"); } よろしくお願いします。
- 実行後にコンパイルに失敗しましたってどういうことでしょうか。
CPad for LSI C-86というC言語のフリーソフトのコンパイラーを使用しています。OSはWindows Vistaです。 #include <stdio.h> int main() { printf("Test Program") } という単純なプログラムを実行すると、「名前を付けて保存」になってしまい、適当にファイル名を付けて保存すると、 「コンパイルに失敗しました。ファイル”適当なファイル名”は存在しません。」 というコメントが表記されてしまって、プログラムの実行ができません。どなたか原因がわかる方、教えてください。よろしくお願いします。
- 識別子の指定方法?
C++の勉強を始めたのですが、C++のクラスで、 なかなか分からない無い部分があるので、質問させてください。 表現方法が今一分からないのですが 基本クラスで、派生クラスのインスタンスを格納する領域を作りたいのですが、その方法が分かりません。 例えば class a { b* ob2; public: void b_in(){ ob2 = new b; } void show(){ ob2->show(); } }; class b :public a { public: void show(){cout << "出力する";} }; main() { a ob; ob.b_in(); ob.show(); } (当然上プログラムはバグが出ます) という形で、クラスaで、bのクラスインスタンスを管理したいのです 何か方法は無いものでしょうか… よろしくお願いします