プロが教える店舗&オフィスのセキュリティ対策術

BUF_SIZE文字以上ある行を読み込もうとした場合に、 BUF_SIZE文字目以上を表示せずに、 再び次の行頭から画面表示するようにする。
例えば、BUF_SIZEを5に設定して、 次のファイルのように、以下のようなテキストファイル

88888888
333
7777777
1
4444
9999999
666666
55555
22

を入力したとき次のように表示することになる。
8888
333
7777
1
4444
9999
6666
5555
22


以下のようにコードを書いたのですが、うまくいきません。どのようにすればいいのでしょうか。ご教授ください。

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

#define BUF_SIZE 5

int main(void){
FILE *fp;
const char *filename="for_report4-2.txt";
char buf[BUF_SIZE];
char *ch;
int line=1;
char *check_whole_line;
char *str1;


fp=fopen(filename, "r");
if(fp==NULL){
printf("Can't Open File %s\n", filename);
exit(1);
}


while(1){
ch=fgets(buf, BUF_SIZE, fp);//ファイルを一行ずつ読み込み
if(ch==NULL){
break;
}
check_whole_line=strchr(buf, '\n');//読み込んだ文字列の中に\nがあるかどうか判定
if(check_whole_line==NULL){//読み込んだ文字列の中に\nがなかったら、、、
printf("%s", buf);
while(1){
ch=fgets(buf, BUF_SIZE, fp);
if(strlen(buf)>BUF_SIZE){
strncpy(str1, buf, BUF_SIZE);
printf("%s", str1);
}
if(ch==NULL){
break;
}
}
exit(1);
}
else{
printf("%s", buf);
}
}


fclose(fp);
return 0;
}

A 回答 (2件)

>うまくいきません。


このような書き方では無く、どの様になったかを書いて質問する様にしましょう。
    • good
    • 0

表示する文字は4文字になっていますね。

(8888 等)
この場合、bufの大きさは、4文字+改行コード+終端NULLが必要になるため、6バイト必要です。
従って、まず
1案 BUF_SIZE を 5から6に変更する。
   (#define BUF_SIZE 6 と定義する。)
2案 char buf[BUF_SIZE] を char buf[BUF_SIZE+1]にし
   fgets(buf, BUF_SIZE, fp) を fgets(buf, BUF_SIZE+1, fp)
   にする。
のどちらかにしないとだめです。
どちらにしますか?
fgetsはかならず、読み込んだ文字の最後に終端NULL文字(\0)を付加します。
    • good
    • 0

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


このQ&Aを見た人がよく見るQ&A