c言語を用いたcat の自作(コマンド-nを加えたい)です

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
岩手の専門学生

c言語を用いたcat の自作(コマンド-nを加えたい)です

#1

投稿記事 by 岩手の専門学生 » 3年前

Ⅽ言語を用いてcatの一部機能を自作したいです。Windowsです。
現在下記のようなコードまでできており、

コード:

#include<stdio.h>
#include<stdlib.h>

void file_print( char * filename)
{
	FILE *fp;
	int c;
	fp = fopen( filename, "r");
	if (fp == NULL) {
		fprintf(stderr, "%sが開けません\n", filename);
		exit(1);
	}
		while ( ( c = fgetc(fp)) != EOF)
			putchar(c);
		fclose( fp);

	}
int main( int argc, char *argv[])
{
		for ( int i = 1; i < argc; i++)
			file_print( argv[ i]);
	
			return 0;
}
このコードが書かれたファイル(wa.cです)をコンパイルし、
中身を表示したいファイル名(例えばAA.txt、複数のファイルでもOK)を入れて実行すると
下のようになります。
-----------------------------------------------
A@DESKTOP-AAAAAAA:~$ gcc wa.c
A@DESKTOP-AAAAAAA:~$ ./a.out AA.txt
this
is
a
pen
------------------------------------------------
私がやりたいことは先のコードを改良又は付け加えて下のように./a.out の後に-n を入れた際に
それぞれの行に行番号が付くようにしたいです(複数のファイルの場合はそれぞれの
ファイルごとに1からはじまる)。
-------------------------------------------------
A@DESKTOP-AAAAAAA:~$ gcc wa.c
A@DESKTOP-AAAAAAA:~$ ./a.out -n AA.txt
1this
2is
3a
4pen
---------------------------------------------------
私のわがままで申し訳ないのですが、今回はヒントやアドバイスではなく、答えを教えてほしいです。
専門学校で出された課題ですが締め切りが近いのでとりあえず提出だけしたいと思っています。
よろしくお願いいたします。

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: c言語を用いたcat の自作(コマンド-nを加えたい)です

#2

投稿記事 by あたっしゅ » 3年前

東上☆海美☆「
とりあえず行番号が付くようにした版みみ。
https://www.onlinegdb.com/ で C++ モードで確認済みみみ。
-n の処理がわからなかったら、『-n の処理がわからなかった』と言って出すみみ」

コード:

#include<cstdio>
#include<cstdlib>

void 
printLine( int n ) 
{
		printf( "%d", n );
}


void
file_print( char * filename)
{
	FILE* fp = fopen( filename, "rt" );

	if (fp == NULL) {
		fprintf(stderr, "%sが開けません\n", filename);
		exit(1);
	}
	{
		int n=1;
		int c;

		printLine(  n );
		while ( ( c = fgetc(fp)) != EOF) {
			putchar(c);
			if( c=='\n') {
				n++;
				printLine( n );
			}
		}
	}
	fclose( fp);
}


int
main( int argc, char *argv[])
{
		for ( int i = 1; i < argc; i++)
			file_print( argv[ i ]);
	
			return 0;
}


// end.
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

岩手の専門学生

Re: c言語を用いたcat の自作(コマンド-nを加えたい)です

#3

投稿記事 by 岩手の専門学生 » 3年前

迅速な回答ありがとうございます
-n の処理がわからなかったです。
返信していただいたプログラムを使うことでファイルごとに行番号を付けることが出来ましたが
常に行番号を表示したいわけではなく-n を付けたときのみ出るようにしたいです。
理想は下のような感じです。
-n無し
-----------------------------------------------
A@DESKTOP-AAAAAAA:~$ gcc wa.c
A@DESKTOP-AAAAAAA:~$ ./a.out AA.txt
this
is
a
pen
------------------------------------------------
-n有り
-------------------------------------------------

A@DESKTOP-AAAAAAA:~$ gcc wa.c
A@DESKTOP-AAAAAAA:~$ ./a.out -n AA.txt
1this
2is
3a
4pen
---------------------------------------------------
注文が多く申し訳ありません。

Meta3

Re: c言語を用いたcat の自作(コマンド-nを加えたい)です

#4

投稿記事 by Meta3 » 3年前

VisualStudio2019 コマンドプロンプト(x64)c1.c

コード:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void n_file_print( char * filename)
{
	char readline[256] = {'\0'};	
	int n = 1;
	FILE *fp;

	fp = fopen( filename, "r");
	if (fp == NULL) {
		fprintf(stderr, "%sが開けません\n", filename);
		exit(1);
	}
	/* ファイルの終端まで文字を読み取り番号付きで表示する */
	while ( fgets(readline, 256, fp) != NULL ) {
		printf("%d%s",n++, readline);	
	}

	fclose( fp);

}
void file_print( char * filename)
{
	FILE *fp;
	int c;
	fp = fopen( filename, "r");
	if (fp == NULL) {
		fprintf(stderr, "%sが開けません\n", filename);
		exit(1);
	}
		while ( ( c = fgetc(fp)) != EOF)
			putchar(c);
		fclose( fp);

	}
int main( int argc, char *argv[])
{
	if((int)strstr(argv[1], "-n")){

		for ( int i = 2; i < argc; i++)
			n_file_print( argv[ i]);
	}else{
		for ( int i = 1; i < argc; i++)
			file_print( argv[ i]);
	}
	return 0;
}

Meta3

Re: c言語を用いたcat の自作(コマンド-nを加えたい)です

#5

投稿記事 by Meta3 » 3年前

コード:

c:\b>c.bat

c:\b>cl c1.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.28.29336 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

c1.c
c1.c(40): warning C4311: '型キャスト': ポインターを 'char *' から 'int' へ切り詰めます。
Microsoft (R) Incremental Linker Version 14.28.29336.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:c1.exe
c1.obj

c:\b>c1.exe -n AA.txt
1this
2is
3a
4pen
c:\b>c1.exe AA.txt
this
is
a
pen
c:\b>


gcc だと c1.exe は ./a.out になるよ

Meta3

Re: c言語を用いたcat の自作(コマンド-nを加えたい)です

#6

投稿記事 by Meta3 » 3年前

これではどうでしょう

コード:

#include<stdio.h>
#include<stdlib.h>

void n_file_print( char * filename)
{
	char readline[256] = {'\0'};	
	int n = 1;
	FILE *fp;

	fp = fopen( filename, "r");
	if (fp == NULL) {
		fprintf(stderr, "%sが開けません\n", filename);
		exit(1);
	}
	/* ファイルの終端まで文字を読み取り番号付きで表示する */
	while ( fgets(readline, 256, fp) != NULL ) {
		printf("%d%s",n++, readline);	
	}

	fclose( fp);

}
void file_print( char * filename)
{
	FILE *fp;
	int c;
	fp = fopen( filename, "r");
	if (fp == NULL) {
		fprintf(stderr, "%sが開けません\n", filename);
		exit(1);
	}
		while ( ( c = fgetc(fp)) != EOF)
			putchar(c);
		fclose( fp);

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

	if((argv[1][0]=='-')&&(argv[1][1]=='n')){

		for ( int i = 2; i < argc; i++)
			n_file_print( argv[ i]);
	}else{
		for ( int i = 1; i < argc; i++)
			file_print( argv[ i]);
	}
	return 0;
}

Meta3

Re: c言語を用いたcat の自作(コマンド-nを加えたい)です

#7

投稿記事 by Meta3 » 3年前

コード:

c:\b>cl c1.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.28.29336 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

c1.c
Microsoft (R) Incremental Linker Version 14.28.29336.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:c1.exe
c1.obj

c:\b>c1.exe -n AA.txt
1this
2is
3a
4pen
c:\b>c1.exe AA.txt
this
is
a
pen

岩手の専門学生

Re: c言語を用いたcat の自作(コマンド-nを加えたい)です

#8

投稿記事 by 岩手の専門学生 » 3年前

Meta3さん、返信ありがとうございます。
私のやりたいことが完璧に再現できているコードでした。
返信をしていただいた、あたっしゅさん、Meta3さん、に心から感謝いたします。
Meta3さんのコードのコピーではありますがコードと実行結果の例を掲載しておきます。
このコードはⅭ言語を用いたcatの一部機能の自作です。
その機能とは特定のファイルを開き表示すること、
-nを付けて実行した際にファイルごとそれぞれの行の先頭に行番号をふることができます。

コード:

 
#include<stdio.h>
#include<stdlib.h>

void n_file_print( char * filename)
{
	char readline[256] = {'\0'};	
	int n = 1;
	FILE *fp;

	fp = fopen( filename, "r");
	if (fp == NULL) {
		fprintf(stderr, "%sが開けません\n", filename);
		exit(1);
	}
	/* ファイルの終端まで文字を読み取り番号付きで表示する */
	while ( fgets(readline, 256, fp) != NULL ) {
		printf("%d%s",n++, readline);	
	}

	fclose( fp);

}
void file_print( char * filename)
{
	FILE *fp;
	int c;
	fp = fopen( filename, "r");
	if (fp == NULL) {
		fprintf(stderr, "%sが開けません\n", filename);
		exit(1);
	}
		while ( ( c = fgetc(fp)) != EOF)
			putchar(c);
		fclose( fp);

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

	if((argv[1][0]=='-')&&(argv[1][1]=='n')){

		for ( int i = 2; i < argc; i++)
			n_file_print( argv[ i]);
	}else{
		for ( int i = 1; i < argc; i++)
			file_print( argv[ i]);
	}
	return 0;
}
  

実行結果の参考(例としてAA.txtの中身を表示してみる)
-----------------------------------------------
A@DESKTOP-AAAAAAA:~$ gcc code.c
A@DESKTOP-AAAAAAA:~$ ./a.out AA.txt
this
is
a
pen
------------------------------------------------
-------------------------------------------------
A@DESKTOP-AAAAAAA:~$ gcc code.c
A@DESKTOP-AAAAAAA:~$ ./a.out -n AA.txt
1this
2is
3a
4pen
---------------------------------------------------

返信

“C言語何でも質問掲示板” へ戻る