質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

5428閲覧

コマンドライン引数でファイル名を受け取る方法について

masuter0413

総合スコア50

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

1グッド

1クリップ

投稿2018/05/26 23:21

高校生です。現在cの勉強をしています。
やりたいこと
・コマンドライン引数からファイル名を受け取りそのファイルのデータを読み込む
・読み取ったデータを別のファイルに書き込む
・output.txtの1行目に"English Conversation!"を書き込む。
補足
・読み込むファイル名は"input.txt"

txt

1//ここ(1行目は空白) 2Hello! 3How've you been? 4It's so good to see you. 5It's good to see you. 6How've you been? 7Just fine. 8

・書き込むファイル名は"output.txt"

txt

1//空

読み込み・書き込みはそれぞれfgets,fputsを用いる。

現在、自分でかけたコードは以下です。

c

1#include<stdio.h> 2#include<stdlib.h> 3#define NUM 256 4 5 6int main(int argc,char*argv[]){ 7 FILE *fp1; 8 FILE *fp2; 9 char str[NUM]; 10 char*filename_in=argv[1]; 11 char*filename_out=argv[2]; 12 fp1=fopen(filename_in,fp1); 13 fp2=fopen(filename_out,fp2); 14 if(fp1==NULL||fp2==NULL){ 15 if(fp1==NULL){ 16 printf("Cannot Open Read File\n"); 17 } 18 else{ 19 printf("Cannot Open Write File\n"); 20 } 21 exit(1); 22 } 23 fputs("English Conversation!",fp2); 24 while(fgets(str,NUM,fp1)!=NULL){ 25 fputs(str,fp2); 26 }; 27 fclose(fp1); 28 fclose(fp2); 29 return 0; 30 } 31 32

コンパイル結果

c

1 2$ cc 5-1.c -o test5 35-1.c:11:24: warning: incompatible pointer types passing 'FILE *' 4 (aka 'struct __sFILE *') to parameter of type 'const char *' 5 [-Wincompatible-pointer-types] 6 fp1=fopen(filename_in,fp1); 7 ^~~ 8/usr/include/stdio.h:245:61: note: passing argument to parameter here 9FILE *fopen(const char * __restrict, const char * __restrict); 10 ^ 115-1.c:12:25: warning: incompatible pointer types passing 'FILE *' 12 (aka 'struct __sFILE *') to parameter of type 'const char *' 13 [-Wincompatible-pointer-types] 14 fp2=fopen(filename_out,fp2); 15 ^~~ 16/usr/include/stdio.h:245:61: note: passing argument to parameter here 17FILE *fopen(const char * __restrict, const char * __restrict); 18 ^ 192 warnings generated. 20

実行結果```c
$ ./test5 input.txt output.txt
zsh: segmentation fault (core dumped) ./test5 input.txt output.txt

まずコンパイルにおいて何がまずかったのでしょうか?
plzcarryme👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

fopenの第二引数が違います。
説明書をよく読みましょう。

c

1fp1=fopen(filename_in,"r"); 2fp2=fopen(filename_out,"w");

投稿2018/05/26 23:52

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masuter0413

2018/05/27 00:08

読み込みモードは"r",書き込みモードは"w"ではないのですか?
episteme

2018/05/27 00:27

アナタfopen(filename_in,fp1);って書いてる。
guest

0

fp1=fopen(filename_in,fp1);

fopen の第二引数は char* です

fopen


エラーメッセージには、なぜそのエラーが出たのか、という理由が書かれています(この場合はワーニングですが)
せっかく出してもらっているのを読まない、ってのは非常にもったいない話ですよ

投稿2018/05/26 23:48

編集2018/05/26 23:54
y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/27 12:13

だからluckerお兄さんが“なんでみんな英語を読まないんですか”っていう、とってもためになる質問をしたのに、ここの管理者が削除とかしちゃうから問題がもみ消されてしまっているんだと思いまぁす。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問