
いつもお世話になっております。
ファイル操作についてご教授ください。
sample.txtに下記のデータが格納されています。
【sample.txt】
-------------------
りんご 100円
バナナ 120円
苺 150円
-------------------
この状態で、scanfで「バナナ」と入力し、
sample.txtからバナナの行を削除し、
行を詰めるようにしたいのですが、
どのようにしたらいいのでしょうか。
【流れ】
"文字を入力してください"のメッセージ。
↓
「バナナ」と入力。
↓
-------------------
りんご 100円
苺 150円
-------------------
上記のように、scanfで入力した「バナナ」の行が削除され、
行が詰められている上状態にしたいです。
超が付くほどの初心者なので、
ソースも書いていただけると幸いです。
どうぞ宜しくお願い致します。
No.2ベストアンサー
- 回答日時:
下のソースコードをコンパイルして実行すると、sample.txt を読み込んで、output.txt に結果を書き出します。
いかに短いコードで作るか試してみました。------------ ここから ------------
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
static char buf[BUFSIZ], str[BUFSIZ];
static void input(char *c) {
printf("文字を入力してください\n");
scanf("%s", buf);
sprintf(str, "%s %s < sample.txt > output.txt", c, buf);
system(str);
}
static void output(char *s, int l) {
while (gets(buf)) if (strncmp(buf, s, l)) puts(buf);
}
int main(int ac, char *av[]) {
if (ac == 1) input(av[0]); else output(av[1], strlen(av[1]));
return 1;
}
------------ ここまで ------------
ulisrtさん、
ご回答ありがとうございます。
ソースコードも記載していただき、
本当に助かります。
さっそく試させていただきます。
ありがとうございました。
No.4
- 回答日時:
>ulisrtさんの教えていただいたコードに、
>ファイルを削除する内容のコード付け加えようとしているのですが、
>なかなか上手くいきません。
元のプログラムがどういう流れになってるのか理解できてます?
まずはそこから始めた方がいいと思いますよ。
No.3
- 回答日時:
申し訳ありません。
こちらは実行したパスにスペースを含んでいなかったので、手間を取らせてしまったようですね。
ついでなので訂正します。
ソースコードの最後の
return 1;
も
return 0;
の間違いです。
1ではエラー終了扱いになるので。
この回答への補足
説明に漏れがありましたので、
補足させていただきます。
【流れ】
sample.txt読み込み
↓
output.txt書き出し
------------------(ここまではulisrtさんにご協力いただきました。)
↓
sample.txtを削除
どうぞ宜しくお願い致します。
ulisrtさん、
わざわざありがとうございます。
本当に助かりました。
ulisrtさんの教えていただいたコードに、
ファイルを削除する内容のコード付け加えようとしているのですが、
なかなか上手くいきません。
厚かましいお願いなのですが、
どうかご指南いただけないでしょうか。
【追加しようとしているコード】
#include <stdio.h>
int main(void)
{
char *filename = "sample.txt";
if( remove( filename ) == 0 ){
printf( "%sファイルを削除しました", filename );
}
else{
printf( "ファイル削除に失敗しました" );
}
return 0;
}
どうぞ、宜しくお願い致します。
No.1
- 回答日時:
まず、ファイルの内容を直接更新するのはハードルが高いと思います。
(初心者であれば、なおさら)なので、考え方だけ書きますと
「元のファイル<1>を1行ずつ読み込み、必要な行ならば別のファイル<2>に書き出す」
方針が良いのでは?
さらに"元のファイル名"のものだけ残したいとするのであれば、
[a] <2>を"元のファイル名"と違う名前で新しく作成する
→ 終了したら、<1>を削除して、<2>を"元のファイル名"にリネーム
または
[b] "元のファイル名"を別名にリネームしたものを<1>とする
<2>を"元のファイル名"で新しく作成する
→ 終了したら、不要となった<1>を削除する
といった段取りで。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
配列をnビットシフトする
-
コンパイルエラー invalid ope...
-
strsetという関数
-
引数の渡し方と受け方(argv)
-
Win32APIでのエディットボック...
-
memset の第2引数の型
-
DxLibについて質問です
-
2進数でのシリアル通信
-
中置記法の問題なのですが…
-
for next文、do while文、if文...
-
ncursesで...
-
【至急】C言語の問題です、どな...
-
最早開始時間と最遅完了時刻を...
-
C言語 エラーの原因がわからな...
-
信頼区間の1.96や1.65ってどこ...
-
「Aに対するBの割合」と「Aに対...
-
For文の終了値を関数にしても問...
-
数学 一次関数 関数 y=-3/4x+k(...
-
std::set<int> で、ある値が何...
-
Enterキーを押されたら次の処理...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
文字列から空白を取り除きたい...
-
C言語のfor文です。 繰り返しの...
-
CStringをwchar_tに変換したい
-
テキストデータをそのままバイ...
-
ネットワークにつながっている...
-
fgetsなどのときのstdinのバッ...
-
double型の値をchar配列に変換...
-
atoi( ) の反対をやりたい
-
charからLPTSTRへの変換方法
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
c言語プログラミング実行時エラ...
-
c++ 文字列を入力して、一文字...
-
【C言語】構造体内の領域解放(...
-
間接参照のレベルが異なっています
-
C言語の入力した文字を反転させ...
-
構造体のアライメント調整
-
strncpyと_tcsncpy_sのヌルの扱...
-
TCP/IP通信型大文字・小文字変...
-
char型からのバイト数取得
おすすめ情報