C++についての質問です。
あるテキストファイルを読み込み、行頭の空白文字(スペース)を
削除して、別のテキストファイルへ書き出すプログラムを
作成しています。
下記のようにコーディングを行いましたが、
読み込みファイルの1行目が書き出されず、最終行が2回
書き出される状態となってしまいました。
お手数ですが、修正箇所を教えて頂けないでしょうか。
************************************************************
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
#define INPUT_FILE "C:\\input.txt"
#define OUTPUT_FILE "C:\\output.txt"
int main()
{
ifstream fin(INPUT_FILE);
ofstream fout(OUTPUT_FILE);
char str[255];
if(!fin) {
cout << "入力ファイルを開けません\n";
return 1;
}
if(!fout) {
cout << "出力ファイルを作成できません\n";
return 1;
}
fin.getline(str,254);
while(!fin.eof())
{
std::cin.setf( std::ios::skipws ); // スペースの読み飛ばし
fin >> str;
fout << str << std::endl;
}
fin.close();
fout.close();
return 0;
}
************************************************************
よろしくお願いします。
No.2
- 回答日時:
よく考えたら、operator>> はデフォルトで先頭のスペースをスキップするので setf する必要もないような気がする。
>このプログラムでは、テキストの最後に改行コード
>が含まれていると、最終行が2回書き出されてしまいます。
改行も空白文字だから、fin >> str した時に一文字も str に書き込まれずに、前回の内容が残っているのでしょう。多分。
正直、operator>> で単語ごとに読み込むよりも、getline で行単位で読んで自前で空白をカットした方がよいように思います。
ご回答頂きありがとう御座いました。
getlineを使用しても試していたのですが、
なかなかうまくいかずに困っておりました。
具体的な方法についてお分かりでしたら、
教えて頂けないでしょうか。
よろしくお願いします。
No.1
- 回答日時:
いろいろ置いておいて。
。>fin.getline(str,254);
>while(!fin.eof())
>{
> std::cin.setf( std::ios::skipws ); // スペースの読み飛ばし
> fin >> str;
> fout << str << std::endl;
>}
最初に fin.getline() で読んで、while ループで fin >> str ともっかい読んでる。
だいたいなんで std::cin に対して setf してるの?
行の途中に空白があった場合はどうするの?
ご回答ありがとう御座いました。
すいません、質問を投稿した後に誤りに気づきました。
実際は、下記のプログラムになります。
このプログラムでは、テキストの最後に改行コード
が含まれていると、最終行が2回書き出されてしまいます。
if文で改行コード判定すれば良いかと思うのですが、
方法が分かりませんでした。
お手数ですが、解決方法を教えて頂けないでしょうか。
また、行の途中には空白は無いとして考えています。
*******************************
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
#define INPUT_FILE "C:\\input.txt"
#define OUTPUT_FILE "C:\\output.txt"
int main()
{
ifstream fin(INPUT_FILE);
ofstream fout(OUTPUT_FILE);
char str[255];
if(!fin) {
cout << "入力ファイルを開けません\n";
return 1;
}
if(!fout) {
cout << "出力ファイルを作成できません\n";
return 1;
}
fin.setf( std::ios::skipws ); // スペースの読み飛ばし
while(!fin.eof())
{
fin >> str;
fout << str << std::endl;
}
fin.close();
fout.close();
return 0;
}
*******************************
<上記プログラムの実行例>
読み込むテキスト
----------------
名前1
名前2
名前3
----------------
書き出されるテキスト
----------------
名前1
名前2
名前3
名前3 ←余計な行が書き出されてしまう
----------------
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DirectXのD3DXVECTOR3
-
空ENTERの判別
-
c++のvirtual関数および継承に...
-
C++の二次方程式のプログラム
-
VC++で文字列から任意の文字を...
-
リモートデスクトップの接続元I...
-
std::wstringのメモリリークに...
-
switch文のエラーについて
-
2÷3などの余りについて
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
EXCELの分散分析表のP-値が....
-
fflush(stdin)の使い方とprintf...
-
プログラミングの問題です 「金...
-
ラップ関数とはどんなものですか?
-
O(n log n)について2
-
課題なんですが・・・
-
分数を表示するプログラム(長...
-
改行について 1行に何個かづ...
-
比較回数と交換回数表示について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
switch文のエラーについて
-
構文エラーが出ているのですが...
-
VC++で文字列から任意の文字を...
-
enumの値から定義名を文字列化...
-
空ENTERの判別
-
C++でShowCursorを使いたい。
-
なぜ、C++の標準ヘッダをインク...
-
#define中の#のエスケープ
-
C++で、テキストファイルを一行...
-
gccでコンパイル時のエラー
-
C言語のエラーを修正したい
-
#include "fstream.h"
-
C言語のポインターで詰まっている
-
リモートデスクトップの接続元I...
-
構造体配列のvectorへの変換と...
-
JPEGやPNGが読めるLoadImage関数
-
VS2019でofstreamが未定義になる
-
構造体に決められた文字列を入...
-
VHDLのsignedとunsignedの違いは?
-
std::wstringのメモリリークに...
おすすめ情報