>while(1){
>__int a,b;
>__FILE *fp;
>__fp=fopen(name,"w"); //←訂正
>__scanf("%d,%d",&a,&b);
>__fclose(fp);
>}
>のプログラムなのですが、書き込むファイル名を入力しても次の処理へ進みません
>ユーザー関数がおかしいのでしょうか?
次へ進むもなんの、while(1) の無限ループです。次へ進まないようにプログラムされています。よって、抜本的な改良が必要です。
質問は「Cプログラム ファイルの書き込み→読み込み」ということですので、その1例を示すことにします。
要点は、データは fgets() で一括読み込み、strtok() を用いて各データ項に応じて数値(文字列)などを分離・取り込み、fprintf() の書式付き出力を行うプログラム例にあります。あなたの回答プログラムと何処がどのように違うかを確認して下さい。
なお、簡単な入力ミスに対応したプログラム例ともしてありますので、確認してください。
ファイルの読み込みについては、単に読み込むだけの処理となっています。というのも、プログラムが大きくなるとエラー確認が不明瞭になりがちなので、処理を単純にすることでプログラムの見通しが良くなるからです。
ここでは、データ入力の p07a() 関数、データファイル読み込みの p07b() 関数、そして計算の p07calc() 関数の3つに別けてプログラムしてあります。配列の受け渡しなど、ひとつの事例として参照してください。
#include <stdio.h> // fopen(), fclose(), fgets()
#include <stdlib.h> // exit(), atoi()
#include <string.h> // strtok()
#define SIZE 128 // fgets() 関数用
#define MAX 100 // ファイル名用
/* 使用関数のプロトタイプ宣言 */
void p07a(char *name);
int p07b(char *name, int a[], int b[]);
void p07calc(int n, int a[], int b[]);
//メイン関数
int main(void)
{
int a[MAX], b[MAX], n;
char name[MAX / 2];
printf("File Name? ");
fgets(name, MAX - 1, stdin);
strtok(name, "\n");
//ファイルへの書き込み
p07a(name);
//ファイルからの読み込み
printf("Result\n");
n = p07b(name, a, b);
//計算
p07calc(n, a, b);
puts("!!!!!END!!!!!");
return 0;
}
//ユーザー関数
void p07a(char *name)
{
char buff[SIZE], *tp;
FILE *fp;
int i,a,b;
if((fp=fopen(name,"w+")) == NULL){
fprintf(stderr, "Can't open error.\n");
exit(EXIT_FAILURE);
}
i = 0;
printf("Loop end: Push return key only.\n");
printf("%d> ", ++i);
while(*fgets(buff, SIZE - 1, stdin) != '\n'){
a = atoi(strtok(buff, " ,"));
/* for input miss */
if((tp = strtok(NULL, " \n")) == NULL) {
fgets(buff, SIZE-1, stdin);
tp = strtok(buff, "\n");
}
b = atoi(tp);
fprintf(fp, "%d %d\n", a, b);
printf("%d> ", ++i);
}
fclose(fp);
}
void p07b(char *name, int a[], int b[])
{
int i = 0;
FILE *fp;
if((fp=fopen(name,"r")) == NULL){
fprintf(stderr, "Can't open error.\n");
exit(EXIT_FAILURE);
}
while(fscanf(fp,"%d %d", &a[i], &b[i]) != EOF){
if(++i >= MAX) {
fprintf(stderr, "Buffer overflow error.\n");
exit(EXIT_FAILURE);
}
}
fclose(fp);
return i;
}
void p07calc(int n, int a[], int b[])
{
int i, sum_a, sum_b;
float a_ave, b_ave;
printf("Result\n");
sum_a = sum_b = 0;
for(i = 0; i < n; i++){
printf("%d: %d %d\n", i+1, a[i], b[i]);
sum_a += a[i];
sum_b += b[i];
}
*a_ave = (float)sum_a / i;
*b_ave = (float)sum_b / i;
printf("a= %.2f b= %.2f\n", a_ave, b_ave);
}
/* --- 実行結果例 ---
File Name? dat.txt
Loop end: Push return key only.
1> 90 85
2> 85 92
3> 78
87 ← 再追加入力
4> ← return キーでループ脱
Result
1: 90 85
2: 85 92
3: 78 87
a= 84.33 b= 88.00
!!!!!END!!!!!
*/
お礼
ありがとうございます No1の方の指摘で修正したのですが、 未定義の 最初に参照している シンボル ファイル fprint /var/tmp//ccbQWkDf.o ld: 重大なエラー: シンボル参照エラー。P07 に書き込まれる出力はありません。 collect2: ld はステータス 1 で終了しました のようなエラーがでてしまった時はどうすればよいでしょうか?