電子書籍の厳選無料作品が豊富!

以下(abc.c)はあるサイトの「単語数のカウント」のソースコードを変更したものです。コマンドプロンプトで gcc abc として実行してもカウントができません。どこが問題でしょうか

int main(int argc, char *argv[])

{
FILE *fp;
char buff[1024];
unsigned char
*wp;

int num;
unsigned long
word ;

argv[1] = "check.txt";
fp = fopen(argv[1], "r");

word = 0;
while((num = fread(buff, 1, 1024, fp))>0){
for(wp = buff; num>0; num--,wp++){

if(*wp <= '\0'){

word++;

}
}
}
printf("%71d %s\n", word, argv[1]);
fclose(fp);
}

質問者からの補足コメント

  • 先ほどの補足でカウントできないとは、8単語ではなく1単語になりました。

    No.6の回答に寄せられた補足コメントです。 補足日時:2018/08/29 13:53

A 回答 (17件中1~10件)

□□abc□□xyz


においてaはmode=0ですか。でもaは単語の一部で単語の内部ですね。

□は空白の意味です。
最初はmode=0で開始します。
□を検知するとmode=0にしています。なので、aを検知した時はmode=0です。
aを検知した時は、
}else{
//上記以外の文字の場合
//モードが単語外なら、単語内に設定し、単語数をカウントアップ
if (mode == 0){
mode = 1;
word++;
}
}
が実行されます。
mode=0なので
if (mode == 0){
mode = 1;
word++;
}
を実行します。
つまり、modeを1に切り替えます。(単語内に入った状態にします)
そして、単語数をカウントアップします。



「単語外なら、単語内に設定し」これもわかりません
「modeが単語外なら、modeを単語内に設定し」の意味です。
    • good
    • 0

>ふと思い出したのですが、mode とありますが、これはどういう意味でしょうか



ソースのコメント通りの意味です。
int mode = 0; //0:単語の外にある状態 1:単語の内にある状態

1文字ずつ処理するので、「空白、タブ、改行」以外を単語構成文字とします。(ここでは単語の定義をそのように定義します)
□□abc□□xyz
を処理する時、aを検出した時に単語数のカウントアップをします。(b,cはカウントアップしない)
同様にxを検出した時に単語数のカウントアップをします。(y,zはカウントアップしない)
これは、mode=0で「空白、タブ、改行」を検出した時です。
b,cはmode=1で「空白、タブ、改行」を検出した時です。
    • good
    • 0
この回答へのお礼

なんかよくわからないのですが

□□abc□□xyz
においてaはmode=0ですか。でもaは単語の一部で単語の内部ですね。

//モードが単語外なら、単語内に設定し、単語数をカウントアップ
if (mode == 0){
mode = 1;
word++;

「単語外なら、単語内に設定し」これもわかりません

お礼日時:2018/09/03 18:25

>調べてみると「phpでワードファイルを出力する」ということです。

テキストがほしいのですが
下記のサイトにPHPでwordをテキストファイルに変換するライブラリが提供されています。
https://www.phpclasses.org/package/7934-PHP-Conv …
    • good
    • 0

No13です。


PHPwordはテキストファイル→DOC(DOCX)ファイルの変換で、その逆はないかもしれません。

DOC(DOCX)からテキストファイルへの変換例が(linuxですが)下記のサイトにあります。
http://engineer-milione.com/tips/word-text.html
    • good
    • 0
この回答へのお礼

上記のサイトでできそうですね。試してみます。

お礼日時:2018/09/01 14:42

>ならば例のサイトはどのようにしているのだろうかと疑問に思います。


>まさか待機していてアプロードされたファイルを人力で変換するようなことはないでしょうが。でもそれしか考えられません。

一例ですがPHPwordのようなものを使用されているのではないでしょうか。
https://qiita.com/satthi/items/761f7d956e2e9ca76 …

PHPwordはライブラリですが、その「変換機能の核」の部分はC言語かC#で作成されていると思います。
    • good
    • 0
この回答へのお礼

PHPwordについてはちらっと聞いたことがあります。
調べてみると「phpでワードファイルを出力する」ということです。テキストがほしいのですが

お礼日時:2018/09/01 14:36

>自動又はファイルコンバータを使用するにせよ、プログラムが必要になると思いますが、それはPHP又はC言語でしょうか


そのサイトがphpで作られている前提ですが、
その場合は、そのプログラムはphpです。但し、phpはそのコンバータを呼び出しているだけです。(又は変換機能を使用しているだけ)
少なくともphpの命令のみでwordを読み込み、テキストファイルへの変換を行うのは無謀かと。
コンバータ自体(若しくは変換機能自体)は、想像ですがC言語もしくはC#で作られているかと思います。
    • good
    • 0

No10です。


doc,docxをテキストファイルに変換するプログラムをC言語で作成するには、
doc,docxの正確なフォーマットを知らなければなりません。もし、単純に"abc"という文字のみを書いたものを
doc,docxに保存した場合でも、その文字の色、サイズ、フォントの種類、wordのバージョン、作成者等の情報が
そのファイルには含まれているはずです。それをすべて取り除いて、"abc"のみを抽出する必要があります。
又、doc,docxのフォーマットをマイクロソフトは一般に公開していません。(私が知らないだけかも知れませんが・・・)
もし、そのフォーマットを入手できたとしても、そのプログラムを完成させるのは非常に多くの労力を必要とします。
すくなくとも、このサイトでソースを提示できる程度の作業量ではありません。
    • good
    • 0
この回答へのお礼

ならば例のサイトはどのようにしているのだろうかと疑問に思います。
まさか待機していてアプロードされたファイルを人力で変換するようなことはないでしょうが。でもそれしか考えられません。

お礼日時:2018/09/01 14:09

>ところで、あるサイトでファイルをアップロードして単語数を表示するというのがありました。


>テキスト、.doc,.docxが可能だったと思います。これはどういうようにしたのでしょうか
たぶん、想像ですが、doc,docxを一旦テキストファイルに変換してから、単語数をカウントしたのではないでしょうか。

手動でdoc,docxをテキストファイルに変換する場合は、wordを起動して、「名前を付けて保存」を行い、書式なし(*.txt)
を選択すると、テキストファイルに変換できます。このような作業を自動でおこなうか、ファイルコンバータのようなものを
使用していると考えられます。
以下はファイルコンバーターの一例です。
https://www.gigafree.net/tool/office/MwisoftWord …
    • good
    • 0
この回答へのお礼

>このような作業を自動でおこなうか、ファイルコンバータのようなものを
使用している

自動又はファイルコンバータを使用するにせよ、プログラムが必要になると思いますが、それはPHP又はC言語でしょうか

お礼日時:2018/09/01 13:08

.doc,.docxのファイルについて



対象となるファイルをメモ帳から開いてみましょう。
メモ帳を起動し、ファイルを開く、からファイルの種類の全てのファイルに変えるとメモ帳で.docファイルを読めます。

多分、とんでもない文書(ともいえないような何か)が表示されるでしょう。
質問者のプログラムはこのようなとんでもないデータを読み込んでいるのです。
こんなファイルの単語のカウントができるでしょうか?
    • good
    • 0
この回答へのお礼

>こんなファイルの単語のカウントができるでしょうか?
無理だということですね。

ところで、あるサイトでファイルをアップロードして単語数を表示するというのがありました。テキスト、.doc,.docxが可能だったと思います。これはどういうようにしたのでしょうか

お礼日時:2018/08/31 19:06

>ありがとうございました。

txt, docの場合はできました。
>ところでargv[1] = "check.docx" (同じ文章)の場合はカウントできないようですが
docでできたのはたまたまです。
このプログラムはテキストファイルだけしか対応していません。
従って、docxには対応していません。(xlsxとかxlsとかもできません。)
docxはMirosoft独自のWord専用のフォーマットで書かれています。それをテキストファイルのように扱うことはできません。
    • good
    • 0
この回答へのお礼

ふと思い出したのですが、mode とありますが、これはどういう意味でしょうか

お礼日時:2018/09/03 17:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!