[英]reading a number of type double from a text file
我仍然停留在這個問題上,我已經嘗試了很多方法來解決這個問題,但仍然沒有成功……我要做的就是將數字讀入一個數組,將字母讀入另一個數組。 這樣,我可以同時調用兩個書,對兩本書的字母頻率進行統計分析。 我知道如何對字符串執行此操作,但是我只想復制數字的輸入,數字代表的是字母前面的兩個空格。 該代碼通過命令提示符(argv [1]和argv [2])讀取兩個文件,並將兩個文件的均方根(RMS)作為輸出進行比較。 這是我到目前為止的代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#define NUM_LETTERS 26
int main( int argc, char *argv[] )
{
FILE *fp, *fp2;
int ch, i, counter;
double frequencysquared[NUM_LETTERS], freqone[NUM_LETTERS], freqtwo[NUM_LETTERS], average;
fp = fopen(argv[1], "r");
fp2 = fopen(argv[2], "r");
while((ch=fgetc(fp)) != EOF)
{
freqone[ch] = fgets(/*unsure*/, 22, fp);
}
while((ch=fgetc(fp2)) != EOF)
{
freqtwo[ch] = fgets(/*unsure*/, 22, fp2);
}
while(i=0; i<NUM_LETTERS; i++)
{
average += pow(( freqone[i]-freqtwo[i] ), 2);
}
average/=NUM_LETTERS;
average = sqrt(average);
printf("RMS Frequency: %lf", average);
fclose(fp);
fclose(fp2);
return 0;
}
文本文件:
A 0.08030130328545595500
B 0.01404566680148545800
C 0.02309245337888202900
D 0.04680329046987134100
E 0.12475974957130967000
F 0.02262448732647651800
G 0.02092142515718645500
H 0.06495870199587520900
I 0.06832638626586488900
J 0.00118328558965393900
K 0.00796545073487383260
L 0.03678714564106335500
M 0.02553256208071077300
N 0.07071134182580297900
O 0.07759211410349403600
P 0.01653257210855475400
Q 0.00111309068179311220
R 0.06200383063640040700
S 0.06269909448568859700
T 0.09005003894146078300
U 0.02792921679195900500
V 0.00865068674018190480
W 0.02356209073861756000
X 0.00115988728703366340
Y 0.02033479628434954300
Z 0.00035933107595423293
該程序的大致輪廓是正確的,但是您有許多錯誤的細節。 一方面, scanf
可以照顧到獲得輸入。 無需擺弄琴弦。
另外,您需要更好的錯誤檢查。
這是一個開始:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define SIZE ('Z' - 'A' + 1)
void die(int err) {
fprintf(stderr, "error %d\n", err);
exit(err);
}
int main(int argc, char *argv[]) {
char ch;
double f, a[SIZE], b[SIZE];
FILE *fa, *fb;
if (argc != 3) die(1);
fa = fopen(argv[1], "r");
if (!fa) die(2);
fb = fopen(argv[2], "r");
if (!fb) die(3);
for (int i = 0; i < SIZE; ++i)
a[i] = b[i] = -1.0;
while (fscanf(fa, " %c%lf", &ch, &f) == 2)
if ('A' <= ch && ch <= 'Z') a[ch - 'A'] = f; else die(4);
fclose(fa);
while (fscanf(fb, " %c%lf", &ch, &f) == 2)
if ('A' <= ch && ch <= 'Z') b[ch - 'A'] = f; else die(5);
fclose(fb);
double sum_d2 = 0;
for (int i = 0; i < SIZE; ++i) {
if (a[i] < 0 || b[i] < 0) die(100 + i);
double d = a[i] - b[i];
sum_d2 += d * d;
}
double rms = sqrt(sum_d2 / SIZE);
printf("RMS Frequency: %f\n", rms);
return 0;
}
一次執行一個步驟。 使代碼盡可能簡單。 最好使用一個單獨的函數來計算RMS
,因為主函數中的所有內容都會變得不知所措。
這是一些示例代碼,可以幫助您完成任務:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NUMLETTERS 26
#define RMS_VALID 1
#define RMS_INVALID 0
double calc_rms(double X[], double Y[], int n, double *rms);
void read_file(double numbers[], char letters[], FILE *stream);
int
main(int argc, char const *argv[]) {
FILE *fp1, *fp2;
double numbers1[NUMLETTERS], numbers2[NUMLETTERS];
char letters1[NUMLETTERS], letters2[NUMLETTERS];
double rms;
fp1 = fopen(argv[1], "r");
fp2 = fopen(argv[2], "r");
if (fp1 == NULL || fp2 == NULL) {
fprintf(stderr, "%s\n", "Error Reading a File");
exit(EXIT_FAILURE);
}
read_file(numbers1, letters1, fp1);
read_file(numbers2, letters2, fp2);
if (calc_rms(numbers1, numbers2, NUMLETTERS, &rms) != RMS_INVALID) {
printf("RMS Frequency: %f\n", rms);
}
return 0;
}
void
read_file(double numbers[], char letters[], FILE *stream) {
double onedouble;
char oneletter;
int count = 0;
while (fscanf(stream, " %c %lf", &oneletter, &onedouble) == 2) {
numbers[count] = onedouble;
letters[count] = oneletter;
count++;
}
}
double
calc_rms(double X[], double Y[], int n, double *rms) {
int i;
double sum = 0.0, diff;
if (n <= 0) {
return RMS_INVALID; // just for precaution
}
for (i = 0; i < n; i++) {
diff = (X[i] - Y[i]);
sum += diff * diff;
}
*rms = sqrt(sum/n);
return RMS_VALID;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.