![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
C言語を今日から始めたじいさんです。
宜しくお願い致します。
メモ帳を使って3行ほどの文字列を入力して、text.txtファイルに保存します。
この文字列を読み込んで、1行ずつ印刷しようとしていますが fgetsでtxtファイルの終了条件がわかりません。
while(fgets(row , sizeof( row ) , fp) != NULL){
printf("%s\n , row);
}
fclose( fp );
return 0;
のようにしているのですが、3行印字処理をして異常終了してしまいます。
本に出ている例をそのまま実行しているのですが、うまくいきません。
txtファイルをダンプしてみると各行の後ろに0d 0aたぶんCR,LFが入っていてNULL=00(?)はありません。テキストファイルの作り方に問題があるのでしょうか?
それともfgetsの使い方に誤りがあるのでしょうか?
No.7ベストアンサー
- 回答日時:
txtファイルの3行目の次が空行(改行だけの行)になっていないですか?
3行目の終わりのCRLFの次にもうひとつのCRLFがないか、ダンプで確認してみて下さい。
0d 0aがCR,LFならば、3行目の終わりの0d 0aのみで
もうひとつの0d 0aはありませんでした。
ダンプからすると変なコード等は一切はいっていないのですが、
もう一度、作成しなおしてみたら動いてしまいました。
正常に動いたファイルのダンプと全く同じなのですが???
これ以上は初心者なのでギブアップです。
色々とアドバイス頂き有難う御座いました。
No.4
- 回答日時:
>001,aiueo.05
>003,sasisuseso.55
名前と年齢の区切りがカンマ","ではないですが。
この回答への補足
コピペすれば良かったですね。
新たに入力したので間違えてしまいました。
実際のファイルはカンマであることを確認しました。
どうもすいませんでした。
No.3
- 回答日時:
fgets()は「読み込むものが無い」、つまりファイル終端に辿り着いたらNULLを返します。
ぱっと見では(#2で修正されてる部分はともかくとして)コード自体に問題はないと思いますが、どのようなtext.txtを読んだらどのように異常が発生しましたか?
この回答への補足
テキストファイルはメモ帳を使って以下のような文字列を入力しています。
001,aiueo.05
002,kakikukeko,99
003,sasisuseso.55
実際のソースコードは
#include <stdio.h>
#include <string.h>
typedef struct list{
char id[3+1];
char name[10+1];
char age[2+1];
}list;
int main(void)
{
list lists[100];
FILE *fp;
char row[20];
char *p;
int i=0;
fp = fopen("./test.txt","r");
if(fp == NULL){
printf("ファイルをオープンできませんでした。\n");
return 1;
}
else{
printf("ファイルをオープンしました。\n");
}
while(fgets(row, sizeof(row), fp) != NULL){
p = strtok(row, ",");
printf("%s\n",p);
strcpy(lists[i].id, p);
p = strtok(NULL, ",");
printf("%s\n",p);
strcpy(lists[i].name, p);
p = strtok(NULL, ",");
printf("%s\n",p);
strcpy(lists[i].age, p);
i++;
}
fclose(fp);
return 0;
エラーメッセージは
「問題が発生したため、xxx.exeを終了します。ご不便をおかけして申し訳ありません」
No.2
- 回答日時:
ご提示くださったソースコードには、
>while(fgets(row , sizeof( row ) , fp) != NULL){
全角の{ を使っている
>printf("%s\n , row);
" の対応が取れていない
というエラーがありました。これらを修正した下記のコードを使って、
aaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccc
という内容のtest.textを読込むと、当方の環境では想定どおりの結果を得ました。
お使いの入力ファイルの1行の長さが配列の定義範囲を超えている、というようなことはありませんか?
#include <stdio.h>
int main(void)
{
FILE *fp;
char row[24];
fp = fopen("./test.text", "r");
if (fp == NULL) {
printf("ファイルオープンエラー\n");
return -1;
}
while (fgets(row, sizeof(row), fp) != NULL) {
printf("%s\n", row);
}
fclose(fp);
return 0;
}
この回答への補足
申し訳ございません。
実際はこのようなソースコードになっています。
test.txt
001,aiueo.05
002,kakikukeko,99
003,sasisuseso.55
#include <stdio.h>
#include <string.h>
typedef struct list{
char id[3+1];
char name[10+1];
char age[2+1];
}list;
int main(void)
{
list lists[100];
FILE *fp;
char row[20];
char *p;
int i=0;
fp = fopen("./test.txt","r");
if(fp == NULL){
printf("ファイルをオープンできませんでした。\n");
return 1;
}
else{
printf("ファイルをオープンしました。\n");
}
while(fgets(row, sizeof(row), fp) != NULL){
p = strtok(row, ",");
printf("%s\n",p);
strcpy(lists[i].id, p);
p = strtok(NULL, ",");
printf("%s\n",p);
strcpy(lists[i].name, p);
p = strtok(NULL, ",");
printf("%s\n",p);
strcpy(lists[i].age, p);
i++;
}
fclose(fp);
return 0;
No.1
- 回答日時:
ソースコードを、全部見せていただけますか?
断片だけを見ても、原因や対策がわからないことがあります。
この回答への補足
以下のようなプログラムです。
#include <stdio.h>
#include <string.h>
int main(void)
{
FILE *fp;
char row[24];
fp=fopen("./test.text","r");
if(fp==NULL){
printf("ファイルオープンエラー\n");
return -1;
}
while(fgets(row , sizeof( row ) , fp) != NULL){
printf("%s\n , row);
}
fclose( fp );
return 0;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- UNIX・Linux テキストファイルをページ番号付きでコマンドラインから印刷したい 1 2023/02/22 12:47
- Excel(エクセル) Excelでなぜこのような式をつかっているのでしょうか、行に1,2,3と連番を振るだけなのに 5 2023/04/08 20:00
- PHP PHPでテキストファイルに保存した時の改行問題 1 2022/11/19 15:07
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 入力待ちをして、受け取った正の整数が表す行数だけ既存 4 2022/07/05 10:12
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル内のデータを1行削除...
-
fortranで文字列を読み込む際の...
-
C言語でファイルから読み込みが...
-
int型の値をファイルに保存
-
BCB 読み込み。
-
EOF判定されない
-
fopenで開いたファイルのサイズ...
-
アクセスカウンターが更新され...
-
テキストファイルの行数を取得...
-
UNIXシェルプログラム等からバ...
-
ファイルポインタが動かない・・・
-
C言語での改行コードの扱いにつ...
-
C言語初心者の質問失礼します。
-
OLE又はDDEを使うVISUAL BESIC...
-
バッファとは何ですか
-
C言語関数違いについて。
-
ExcelVBAでカレントディレクト...
-
パラメータが正しくありません...
-
windows.hがincludeされない
-
VB.NETで他のプロジェクトで作...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル内のデータを1行削除...
-
テキストファイルの行数を取得...
-
バイナリファイルをテキストフ...
-
fgetsで2行目から文字化け
-
VBSで指定行に挿入
-
ファイルサイズ指定し、ファイ...
-
c言語 2つのファイルを行ご...
-
freadとfwrite
-
winsock recvでの文字化け
-
【VB.Net】バイト型配列に読み...
-
C言語での改行コードの扱いにつ...
-
fopen(書き込みモード)でファイ...
-
fortranで文字列を読み込む際の...
-
EOF判定されない
-
改行までの一文字ずつのファイ...
-
InternetReadFileで大きいファ...
-
freadでファイルを読み込んだ際...
-
C言語での採番について
-
複数テキストファイルを読み込...
-
C言語 バイナリファイルの読み...
おすすめ情報