アプリ版:「スタンプのみでお礼する」機能のリリースについて

test.txtというテキストファイルに入力されている文字を読み込んでtest1.txtに7文字になったなら改行して2行目に書き込み、また2行目が7文字以上になったら3行目に書き込むというプログラムを作りたいのですがどうもうまくいきません。色々ネットで探したりしたのですがstrlenをうまく使うのかな~ぐらいしか見当はつきません・・・。
何かよいアドバイスをお願いします!m(_ _)m



test.txt
---------------------------------
私の一番好きな食べ物はリンゴです。
---------------------------------
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

test1.txt
----------------------------------
私の一番好きな
食べ物はリンゴ
です。
----------------------------------

A 回答 (5件)

#include <stdio.h>



int iskanji(unsigned char c){
//シフトJIS、1バイト目
//(0x81 <= c <= 0x9F あるいは0xE0 <= c <= 0xFC)
return (0x81 <= c && c <= 0x9F) || (0xE0 <= c && c <= 0xFC);
}

int main(void){
FILE *fin, *fout;
int c;
unsigned count=0;

fin=fopen("test.txt", "r");
fout=fopen("test1.txt", "w");

while(EOF!=(c=fgetc(fin))){
fputc((char)c, fout);
count++;
if(c == '\n'){
count=0;
}
if(iskanji((unsigned char)c)){
fputc(fgetc(fin), fout);
}
if(count && count % 7==0){
fputc('\n', fout);
}
}
fclose(fout);
fclose(fin);

return 0;
}
    • good
    • 0
この回答へのお礼

返答ありがとうございます。このプログラム通りに入力してみましたところ、半角はうまく7文字ごとに改行されて出力したのですが漢字などの全角の場合ですと文字化けをしてしまいまして表示できませんでした。
そこで質問なのですが
(0x81 <= c && c <= 0x9F) || (0xE0 <= c && c <= 0xFC);
この文はなにを意味しているのでしょうか?
私としてはここに原因があるものと考えています。
何卒よろしくお願いします。

お礼日時:2006/05/31 04:31

#2>漢字などの全角の場合ですと文字化けをしてしまいまして表示できませんでした。


そうですか・・(;_;)

#2>(0x81 <= c && c <= 0x9F) || (0xE0 <= c && c <= 0xFC);
この部分は、SHIFT_JIS の1バイト目を判定するものです。
日本語の文字コードとして、SHIFT_JISが使われていると想定しています。
1バイト目が該当するとき、無条件に2バイト目を出力しています。
    • good
    • 0
この回答へのお礼

なんか色々やったら出来るようになりました!
ありがとうございました!

お礼日時:2006/05/31 11:37

テキストが英字(一バイト文字)だけなら



int main(int argc, char *argv[])
{
 FILE *in,*out;
 char szText[8];
 if((in=fopen("test.txt","r"))==NULL) {
  printf("test.txtが開けません\n");
  return 0;
 }
 if((out=fopen("test1.txt","w"))==NULL) {
  printf("test1.txtが開けません\n");
  fclose(in);
  return 0;
 }
 while(fgets(szText,8,in)!=NULL) {
  fprintf(out,"%s",szText);
  if(strlen(szText)==7)
   fprintf(out,"\n");
 }
 fclose(out);
 fclose(in);
 return 0;
}

で出来るはずだけどね……
    • good
    • 0

手元のBCC5.5.1 では正常だけど、


それ以外では正常かどうか確信が持てない
添削希望回答です。

アルファベットと日本語を同じ一文字と扱うために、setlocale () を使ってます。

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(void){
setlocale(LC_NUMERIC,"jpn");

wchar_t* fn = L"test.txt";
wchar_t* output = L"out.txt";
FILE* fp = _wfopen(fn, L"r"), *fout = _wfopen(output, L"w");

if (fp == NULL){
fwprintf(stderr, L"ERROR: \" %s \" Not Found\n", fn);
return EXIT_FAILURE;
}

wchar_t buf[8];
wchar_t* wct;

while ( ( wct = fgetws(buf, sizeof(buf)/sizeof(buf[0]), fp) ) != NULL){
fwprintf( fout, L"%s\n", wct );
}

fcloseall();

return EXIT_SUCCESS;
}
    • good
    • 0

7文字毎に改行する方法ならば以下でどうでしょう。


strlenを使う必要はないです。
0. 書き出し用バッファを初期化する。
1. ループして、読み込んだ文字を1文字ずつ書き出し用バッファに追加する。
2. 7文字出来たらループを抜ける。
3. 改行文字を書き出し用バッファに追加。
4. 読み込む文字がまだあるのならば1.に戻る。
5. 読み込む文字が終了したら書き出しバッファの内容をtest1.txtに書き出す。

1.のところでは半角、全角の処理をきちんとやってくださいね。
    • good
    • 0
この回答へのお礼

まずは、こんな夜分にお返事をして下さってありがとうございます。質問欄に記述し忘れたのですがC言語は素人同然なのでまたいくつか質問させていただきます。
書き出し用バッファとは何でしょうか?
また、半角・全角の処理をきちんとやると言うのはどういう事でしょうか?
何卒、よろしくお願いします。

お礼日時:2006/05/31 02:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!