ファイルの内容をstrcpyを使ってコピーしたら表示がおかしくなりました。
何故か改行が自動的に入るのです。
---ソースの内容---
#include <stdio.h>
#include <string.h>
void main(void){
FILE*fp;
char buf[100];
char set[100];
fp = fopen("fail.txt", "r+");
while( fgets( set, 100, fp ) != NULL ){
strcpy(buf,set);
printf("%s\n", buf);
}
fclose(fp);
}
---ソースの内容ここまで---
---ファイルの内容---
One dey.
He sey this is pen.
But,it is chear.
why?
Oh!No!
---ファイルの内容ここまで---
---出力された内容---
One dey.
He sey this is pen.
But,it is chear.
why?
Oh!No!
---出力された内容 ここまで---
出力された内容をファイルの内容と同じにするにはどう書けばいいのでしょうか?
No.2ベストアンサー
- 回答日時:
#1さんの仰る通り、strcpyではなくfgetsの仕様です。
fgetsは改行まで読み込みますので。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=m …
「改行文字があるなら、保持されます。」
逆に、改行文字がない場合は改行が入らないのでprintfで勝手に\nをつけるとbufの大きさ以下の長さの行があった時、変なことになります。
while( fgets( set, 100, fp ) != NULL ){
strcpy(buf,set);
printf("%s", buf);
}
のようにprintfで\n(改行)をつけないで書くと良いでしょう。
あと、別の処理をするために一時的にコピーがほしいならstrdupを使うという手もありますね。
この回答への補足
なるほどいろいろ注意点があるのですね
参考になりました。
while( fgets( set, 100, fp ) != NULL ){
strcpy(buf,set);
printf("%s", buf);
}
で簡単に修正できましたありがとうございました
No.3
- 回答日時:
既に回答されているようにfgets()で読み込んだバッファから改行コードを取り除くか
>printf("%s\n", buf);
で改行させないか…のどちらかでしょう。
1行が100バイトを越えている場合にどうなるか…というのはありますが。
No.1
- 回答日時:
>while( fgets( set, 100, fp ) != NULL ){
>strcpy(buf,set);
fgets関数を使って読み取ったsetの最後に改行コードが入っているからです。
fgets関数の仕様です。
setの最後の改行を取り除くには、例えば下記のようなコードを書きます。
set[strlen(set) - 1] = '\0';
こうしておいてからstrcpyすれば、たぶん大丈夫です。
この回答への補足
教えていただいた
set[strlen(set) - 1] = '\0';
ですが最後の一文字が表示されなくなるバグがありました
fgetsが自動的に改行されるとの事なので
printf("%s",set);
とすることで改行を取り除けましたありがとうございました
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 入力待ちをして、受け取った正の整数が表す行数だけ既存 4 2022/07/05 10:12
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- Gmail 【お助け!】サーバーからのメール送信でGmailに送信されない問題について 1 2023/06/20 22:03
- Visual Basic(VBA) 空白のセルを変更しようとした時(アクティブセル)に インプットボックスを5回出す インプットボックス 1 2023/03/14 11:01
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
ファイルから読み取った改行文...
-
エスケープ文字の復帰(¥r)と...
-
COBOLの改行
-
改行について
-
【VBA】エクセルで最後の不要な...
-
C++で空Enterの入力を判...
-
jsp 改行コードで改行させて表...
-
delphi でのコード上でTab を入...
-
タグの中の改行文字を正規表現...
-
コンボボックスの項目中に改行を
-
秀丸の正規表現で複数行にわた...
-
JavaDoc コメントの改行について
-
改行コードが半角スペースにな...
-
LaTeX: captionの中で改行した...
-
テキストファイルから改行コー...
-
C# DataGridViewのセルを改行禁...
-
C++でのCRLFについて
-
VBAでCSVをExcelに取り込む時に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
エスケープ文字の復帰(¥r)と...
-
ファイルから読み取った改行文...
-
JAVA System.out.println の ...
-
C++で空Enterの入力を判...
-
COBOLの改行
-
テキストファイルから改行コー...
-
改行について
-
【VBA】エクセルで最後の不要な...
-
1行ごとに取得して、その改行...
-
jsp 改行コードで改行させて表...
-
VBAでCSVをExcelに取り込む時に...
-
エクセルVBA 文字列領域が不足...
-
最終行の改行について
-
改行を読み飛ばす
-
コンボボックスの項目中に改行を
-
ExcelVBAでメールを作成してメ...
-
テキストボックス行の桁数を制...
-
JavaMail,本文中の改行について
おすすめ情報