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

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

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

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

Q&A

4回答

154閲覧

C言語のファイルread, writeについて

quiz3

総合スコア25

C

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

0グッド

1クリップ

投稿2017/09/08 10:16

visual studio2017 でcのプログラムを作成しています。
test.txtが1行データなので、65byteずつに改行したtext_new.txtを作ろうと思っています。

fp = fopen(fname, "r"); fp2 = fopen(fname2, "w"); while (fread(str, 1, 50, fp) != NULL) { //表示 printf("%s\n", str); fprintf(fp2, "%s\n", str); } fclose(fp); fclose(fp2);

Debug Assertion Failed!エラーが出ます。
fread.cppのLine:48
がダメとなっているのですが、回避法を教えてください。
よろしくお願いします。

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

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

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

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

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

mattn

2017/09/08 10:19 編集

コードブロックを「必ず」使って下さい。今からでも修正可能です。あと48行目がどの行か分かりません。
mattn

2017/09/08 10:26 編集

コードブロックにするには、編集ボタンを押してソースコードの始めと終わりにそれぞれ ``` だけの行を追加します。間違いやすいので ``` はコピーして使って下さい。
cateye

2017/09/08 10:32

test.txtが文字データのは分かりますが、文字コードは何でしょう?
mattn

2017/09/08 10:37

コードを全部載せて下さい。str が容量分宣言されていない、fname が "test.txt" でない、など落ちる可能性がいくらでもあります。
guest

回答4

0

ソースコードを全部載せて頂けないので、落ちないコードを書いておきます。

int n; fp = fopen(fname, "r"); if (fp == NULL) { perror("fopen(fname)"); exit(1); } fp2 = fopen(fname2, "w"); if (fp2 == NULL) { perror("fopen(fname2)"); exit(1); } while ((n = fread(str, 1, sizeof(str)-1, fp)) > 0) { str[n] = 0; //表示 printf("%s\n", str); fprintf(fp2, "%s\n", str); } fclose(fp); fclose(fp2);

投稿2017/09/08 10:59

編集2017/09/08 14:26
mattn

総合スコア5030

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

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

0

freadをするならバイナリモードでfopenしましょう。fprintfならばテキストモードです。

このほかはプログラムの全体像、ファイルのデータフォーマットがわからないので確定的なことは言えません。とりあえず、配列の長さが足りない可能性があります。ちなみにエラーメッセージでは行番号を教えてくれているので、その行がヒントになります。

投稿2017/09/08 13:46

HogeAnimalLover

総合スコア4830

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

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

0

こんにちは。

strの型宣言がないので良く分かりませんが、char str[50];と宣言していると仮定して回答します。
また文字はASCII文字と仮定します。(漢字等のワイド文字を含まないという意味です。)

①1度に65文字読み込んでそれを改行して出力するのであれば、char str[65];は最低必要と思います。
②printf("%s\n", str);で出力するのであれば、'\0'で終端する必要があります。
readで「1バイト単位」で最大65バイト読み込み、読み込めた文字列の最後に'\0'を書きましょう。
この場合、char str[66];とし、65文字読み込めた時に'\0'を設定するための1バイトを確保しましょう。

後、mattnさんのアドバイスにも対応するとより正確な回答が返ってきやすくなりますよ。

投稿2017/09/08 10:38

Chironian

総合スコア23272

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

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

0

fread(str, 1, 50, fp)は50バイトデータを読み込みますが、終端文字'\0'は付きません。なので、次のprintf("%s\n", str);でこけるのでは?
「追記」
strの領域がいくらあるかりませんが、最低51バイトとって最後(str[50])に'\0'を入れましょう。

投稿2017/09/08 10:34

編集2017/09/08 10:39
cateye

総合スコア6851

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問