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

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

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

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

Q&A

解決済

2回答

1578閲覧

fgetsでテキストファイルから文を一行ずつ出力するときに、改行をなくしたいです。

abustoy

総合スコア12

C

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

0グッド

0クリップ

投稿2021/08/12 08:25

前提・実現したいこと

fgets関数を使用してテキストファイルから一行ずつchar型の配列に読み込ませ、それをstdoutに出力させるプログラムにおいて、出力させる際の改行をなくしたいです。
以下のソースコード内のifdef部分を除くと、見た目はテキストファイルの中身のままstdoutに出力されます。そこで、私のしたいことは、標準出力に
1行目2行目3行目
と、改行をなくして出力させることです。
そのためにstrchr関数を使用して配列bufの要素の内改行文字を見つけてそれをnull文字('\0')に変更しました。しかし、ソースコードを実行すると
3行目
と出力されるだけでした。どのように修正すれば意図した結果にできるか、教えていただきたいです。

テキストファイル(test.txt)です

1行目 2行目 3行目

該当のソースコード

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define HOGE 6 7int main(void) 8{ 9 10 FILE *fp=fopen("test.txt","r"); 11 if(fp==NULL){ 12 fputs("ファイルオープンに失敗しました\n",stderr); 13 exit(EXIT_FAILURE); 14 } 15 16 for (;;) 17 { 18 char buf[80]; 19 if( fgets( buf, sizeof(buf), fp ) != NULL ){ 20 21 #ifdef HOGE 22 // 末尾が改行文字であれば、'\0' で上書きする 23 char* p = strchr( buf, '\n' ); 24 if( p != NULL ){ 25 *p = '\0'; 26 27 } 28 #endif 29 30 fputs(buf,stdout); 31 } 32 else{ 33 if( feof( fp ) ){ 34 break; 35 } 36 else{ 37 exit(EXIT_FAILURE); 38 } 39 } 40 41 } 42 43 if(fclose(fp)==EOF){ 44 fputs("ファイルクローズに失敗しました\n",stderr); 45 exit(EXIT_FAILURE); 46 } 47 48 return 0; 49} 50

補足情報(FW/ツールのバージョンなど)

コンパイラはgccを使っております。cygwinを使っております。
ソースコードはこちらのサイトのこのページから少し改変して使用させていただきました。
https://programming-place.net/ppp/contents/c/040.html#chomp

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

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

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

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

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

guest

回答2

0

C言語のコードを組むなら、デバッグ環境を揃えましょう
コードの任意の場所で実行を止めて、変数のナカミを見ることができます
また、1行づつ実行させて、動作を確認できます

Windowsなら、VisualStudio入れてみませんか

投稿2021/08/12 09:04

y_waiwai

総合スコア87800

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

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

abustoy

2021/08/12 09:10

ご回答ありがとうございます。はい、入れてみます。
guest

0

ベストアンサー

おそらく実際のテキストファイルは、改行コードを表現するとこの様になっているのではないかと思われます。

1行目\r\n2行目\r\n3行目

\r はCRと呼ばれるものです。これが実行されると出力先のカーソルが先頭に戻るため、一度出力された「1行目」「2行目」が上書きされます。

どうやったら解決できるかはまずご自身で考えてみてください。

投稿2021/08/12 08:35

mather

総合スコア6753

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

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

abustoy

2021/08/12 09:09

ご回答ありがとうございます。\rというものを教えていただきありがとうございます。たしかにテキストファイルから読み込まれているみたいです。はい、頑張ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問