【发布时间】:2019-02-06 18:31:20
【问题描述】:
我遇到的问题是我正在尝试比较 2 个数字。我将 hGpa 初始化为 char '0.0'。当文件被读取时,它会获得一个 gpa 值并将其与 hGpa 进行比较。如果它更高,则将其值分配给 hGpa。该计划的重点是获得最高的GPA。我的问题是值 hGpa 永远不会改变。我不确定我是否分配不正确,或者我是否将变量放置在错误的位置并且它们不断被覆盖。另外我对C不熟悉,所以如果这是一个愚蠢的错误,我深表歉意。这是我的代码
我已经尝试将值设为全局值,但它们只是不断重置为 0.0000。
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#define MAXCHAR 1000
int main(void){
FILE *fp; //pointer to file
char *filename; //pointer to name of file
char *fileNames[] = {"CSCI4060U_Lab02_data/1.csv", "CSCI4060U_Lab02_data/2.csv",
"CSCI4060U_Lab02_data/3.csv", "CSCI4060U_Lab02_data/4.csv",
"CSCI4060U_Lab02_data/5.csv", "CSCI4060U_Lab02_data/6.csv",
"CSCI4060U_Lab02_data/7.csv"};
long fileSize;
int s = sizeof(fileNames) /sizeof(char*); //array consists of 8 char pointers
//each char consists of 8 bytes in memory
//so you get 64 / 8 = 8;
for(int i = 0 ; i < sizeof(fileNames)/sizeof(char*); i++){
printf("Reading from file #%d: %s\n", i+1, fileNames[i] );
fp = fopen(fileNames[i],"r");
if(fp == NULL){
printf("Could not open file %s",fileNames[i]);
return 1;
}
fileSize = ftell(fp);
char line[MAXCHAR];
char hFirst = "";
char hLast = "";
char hGpa = "0.0";
while(fgets(line, MAXCHAR, fp) != NULL){
//printf("%s\n",line);
char* first = strtok(line, ",");
char* last = strtok(NULL, ",");
char* gpa = strtok(NULL,",");
printf("current highest: %s, %s, %s\n", hFirst, hLast, hGpa);
double numGpa = atof(gpa);
double numHGpa = atof(hGpa);
printf("gpa read: %f ++++++ gpa current: %f\n",numGpa, numHGpa );
if(&numGpa > &numHGpa){
hFirst = first;
hLast = last;
hGpa = gpa;
//printf("after assignment: %s, %s, %s\n", hFirst, hLast, hGpa);
}
}
fclose(fp);
}
return 0;
}
fclose(fp);
我阅读的示例文件如下:
Jesse,Jordan,0.65
Charles,Austin,3.23
Peter,Cole,1.57
David,Hamilton,2.73
基本上它应该进入if语句2次并改变hGpa指向的值。如果我犯了任何愚蠢的明显错误,再次抱歉。
【问题讨论】:
-
请查看编译器警告/错误。
char hGpa = "0.0";应该是char hGpa[] = "0.0";和上面的两个定义类似。而且,在 C 中,您不能使用hGpa = gpa;复制字符串,您需要strcpy()。另外,您为什么不使用您计算的s作为循环控制,而不是重新计算? -
好的,谢谢,我要试试这个。我正在搜索有关堆栈溢出的其他意见,每个人似乎都按照我上面的方式进行操作。
-
可能还有其他问题。例如
fileSize = ftell(fp);不会告诉你文件的大小,它会告诉你打开文件后文件指针的当前位置是0。