プログラミングC言語についてです
こちらの問題がわかりません
どなたか詳しい方、ご解答をお願いします。
実行時に main 関数の引数としてファイル名(つまり,文字列 1 つ)を受け取り,与えられた名前のテキストファイルの文字数・行数・ファイル名をタブ文字で区切って表示するプログラムを作成せよ.実行時に与えるテキストファイルは,ASCII 文字のみからなるものとし,実行ファイルと同じディレクトリに存在するものとする。
ヒント
行数 = 現れる改行文字の個数 + 1
実行例
$ cat testdata
book boots
cat dog horse
car bus train
$ ./prob2 14-2-data.txt
38 3 14-2-data.txt
A 回答 (9件)
- 最新から表示
- 回答順に表示
No.9
- 回答日時:
この質問は「知恵袋」にあったこの問題でしょうか。
(私の解答を書き込んでおきましたが)#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *file;
int tmp; /* 読み込んできた1文字を入れる変数 */
int c = 0; /* 読み込んだ文字数をカウント */
int l = 1; /* 行数をカウント */
if (argc != 2) {
fprintf(stderr, "Error: too few or much arguments");
return 1;
}
//プログラムを完成してください。
if ((file = fopen(argv[1], "r")) == NULL) {
fprintf(stderr, "Error: File cannot be opened");
return 1;
}
int saigo; /* ファイルの最後の1文字を入れる変数 */
for (; (tmp = fgetc(file)) != EOF; c++, saigo = tmp) {
if (tmp == '\n')
l++;
}
fclose(file);
if (c == 0 || saigo == '\n')
l--;
/* または
if (c == 0) {
fprintf(stderr, "Error: File is 0 bytes");
return 1;
}
if (saigo == '\n')
l--;
*/
printf("%d\t%d\t%s\n", c, l, argv[1]);
return 0;
}
最初に、l = 1 としているのも違和感がありますが。やっぱり、問題文がおかしいですね。
No.8
- 回答日時:
申し訳ありません。
テキストファイルが0バイトの場合を考えていませんでした。0バイト対策は、for を抜けた後の if を次のようにしてください。if (mojisu != 0 && saigo != '\n')
gyosu++;
私は、問題文がおかしいというために適当なプログラムを作り投稿しましたが失敗でした。
プログラムでどこまで対応すべきなのか考えないといけませんが、テキストファイルではなくバイナリファイルだった場合どうするの?とか考えればきりがないといいますか。
回答の投稿は「問題文がおかしいと思います」の一言で終わりにするべきだったと後悔しています。
No.7
- 回答日時:
この修正で最後にいたします。
いい加減なプログラム、そして連投、申し訳ありませんでした。/*
prob2kai.c
*/
#include <stdio.h>
int main(int argc, char *argv[])
{
FILE *fp;
int moji, saigo, mojisu, gyosu;
if (argc != 2)
return 1;
if ((fp = fopen(argv[1], "r")) == NULL)
return 1;
for (mojisu = 0, gyosu = 0; (moji = fgetc(fp)) != EOF; mojisu++, saigo = moji) {
if (moji == '\n')
gyosu++;
}
fclose(fp);
if (saigo != '\n')
gyosu++;
printf("%d\t%d\t%s\n", mojisu, gyosu, argv[1]);
return 0;
}
No.6
- 回答日時:
forを抜けた後のprintfがよくないかもですね。
fclose(fp);
/* gyosuは改行を数えただけなので、ここで1を足す */
gyosu++;
printf("%d\t%d\t%s\n", mojisu, gyosu, argv[1]);
No.5
- 回答日時:
私が適当に作ったプログラムです。
Ubuntu 20.04LTSで実行しましたが、回答はWindows 10でしていますので、タブや改行が¥になってしまっています。
/*
prob2.c
プログラミングC言語についてです
こちらの問題がわかりません
どなたか詳しい方、ご解答をお願いします。
実行時に main 関数の引数としてファイル名(つまり,文字列 1 つ)を受け取り,
与えられた名前のテキストファイルの
文字数・行数・ファイル名をタブ文字で区切って表示するプログラムを作成せよ.
実行時に与えるテキストファイルは,ASCII 文字のみからなるものとし,
実行ファイルと同じディレクトリに存在するものとする。
ヒント
行数 = 現れる改行文字の個数 + 1
実行例
$ cat testdata
book boots
cat dog horse
car bus train
$ ./prob2 14-2-data.txt
38 3 14-2-data.txt
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
int moji, mojisu, gyosu;
if (argc != 2)
return 1;
if ((fp = fopen(argv[1], "r")) == NULL)
return 1;
for (mojisu = 0, gyosu = 0; (moji = fgetc(fp)) != EOF; mojisu++) {
if (moji == '\n') {
gyosu++;
printf("[%04x]\n", moji); /* デバッグ用 */
} else
printf("[%04x]", moji); /* デバッグ用 */
}
printf("\nここまでデバッグ表示\n"); /* デバッグ用 */
fclose(fp);
printf("%d\t%d\t%s\n", mojisu, gyosu + 1, argv[1]);
return 0;
}
テキストファイルは、最後の改行を削除したものを使っています。
テキストファイルをcatコマンドで表示したとき、終了後のプロンプト表示位置が問題文と異なってしまいます。
問題文と同じ結果にするには3行目の最後も改行を入れないといけませんが、そうしますと文字数が39になってしまいます。
内容に間違いがありましたら申し訳ありません。
No.4
- 回答日時:
私なりに試してみましたが、問題文がおかしいような気がします。
問題文を読みますと、テキストファイルの3行目の最後には改行はないと思うのですが、geditで作成しますと、改行しなくても保存時に改行が入ってしまいます。
バイナリエディタを使用して最後の改行を削除しますと、今度はcatコマンドで表示させたときに問題文のようになりません。
試しに作ったプログラムも適当に作りましたのできちんとテストしていませんが、問題文の印刷ミスではないでしょうか。
私が勘違いしていましたら申し訳ありません。
No.3
- 回答日時:
あ, 確かに「実行例」がおかしいっすね>#2. というかその前の「問題」の文章もおかしいけど.
まず「文字」ってなんなのか, そしてそれをどう数えるのかがどこにも書いてない. UTF-32 で書かれたファイル突っ込まれたらどうするつもりなんだろう. そして「ヒント」もおかしい. その計算はどうして出てくるのか.
No.2
- 回答日時:
実行例がおかしくない?
38 3 [引数]
って表示するだけのプログラムなら、mainで
printf("38\t3\t%s\n", argv[1]);
でいいんじゃね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語で 英文字のみからなる文字列、”Radar”、”WasItACatISaw”、”a”、””(空 5 2022/12/20 15:17
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- UNIX・Linux テキストファイルをページ番号付きでコマンドラインから印刷したい 1 2023/02/22 12:47
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/08/08 11:02
- C言語・C++・C# C言語の質問です、プログラミング初心者です このような文字列があった場合 "abcdef☆ghijk 4 2022/11/22 10:56
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パソコンに何かが勝手にダウン...
-
エクセルVBA、ステップモードと...
-
管理者として実行を毎回すると...
-
VB.NETでボタンのクリックイベ...
-
Excel実行時エラー-2146959355?
-
C言語再帰アルゴリズム
-
プログラム実行時の、一時停止...
-
パソコンのスクリーンセーバー...
-
実行中のVBSをタスクバーに非表...
-
raspberry pi ,Linux でのプロ...
-
latexでのエラー
-
【急いでます!】pythonでキー...
-
WndProc( ) の UINT に msg を送る
-
起動したアプリケーションを最...
-
VBA コントロールパネルの機能...
-
プロパティの値が不正ですって...
-
VBA中断モードの解除
-
Windows10 で青鬼を遊びたいの...
-
動的ライブラリ中のグローバル変数
-
プログレスバー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パソコンに何かが勝手にダウン...
-
Excel実行時エラー-2146959355?
-
Pythonって何のソフトで動くん...
-
latexでのエラー
-
エクセルVBA、ステップモードと...
-
PC版のMinecraftが応答なしにな...
-
eclipseで、「ポート番号が使用...
-
管理者として実行を毎回すると...
-
パソコンのスクリーンセーバー...
-
VB.NETでボタンのクリックイベ...
-
chatGPTで次々と質問をしていく...
-
EXCEL-VBAでコマンド...
-
VB.NETでDataTableにデータ追加...
-
Windows10 で青鬼を遊びたいの...
-
プログラム実行中に強制停止さ...
-
COBOLで集団項目から符号...
-
VBA コントロールパネルの機能...
-
【急いでます!】pythonでキー...
-
ターミナルからemacsへのコピペ...
-
ランタイム関数とは何ですか?
おすすめ情報