我正在学习如何用C语言编程,而且我在使用文件时遇到了困难。
我该怎么办,例如,有两个文件。上面有1到10名学生的姓名和成绩。 喜欢:
John 10 John 5
Alex 6 Alex 9
Mary 8 Mary 6
如何获取特定学生的特定数字,并添加数字,例如,我是否必须使用fseek,SEEK_END,还是应该使用ftell? 并取所有的中位数?
代码应该如何?
EDIT1: 我尝试了什么(对于葡萄牙语中的变量感到抱歉,我添加了一些评论):
enter code here
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
char nome[30];
float media;
char situacao;
}informa;
// function to create files \/
int cria_arquivo(){
informa A;
char nome[30];
float n1, n2;
`FILE *arq1, *arq2, *arq3, *arq4; //pointers to archives students, grades,` and anothe file to print on
arq1 = fopen("alunos.txt","r"); // students and grades
arq2 = fopen("notas1.txt","r");
arq3 = fopen("notas2.txt","r");
arq4 = fopen("turma.dat", "wb");
if((arq1 == NULL) || (arq2 == NULL) || (arq3 == NULL) || (arq4 == NULL)){
printf("FATAL ERROR - NAO E POSSIVEL ABRIR ARQUIVOS"); //cant open the files
exit(1);
}
while(1){
//printf("ola");
fscanf(arq1, "%s", nome);
printf("%s\n", nome);
if (feof(arq1)) {
break;
}
//printf("Funciona");
fscanf(arq2, "%f", &n1);
fscanf(arq3, "%f", &n2);
strcpy(A.nome, nome);
A.media = (n1+n2)/2;
printf("%f\n", A.media);
if(A.media < 5){
A.situacao = 'F';
}
else{
A.situacao = 'A';
}
fwrite(&A, sizeof(informa), 1, arq4);
}
fclose(arq1); fclose(arq2); fclose(arq3); fclose(arq4);
return 0;
}
int main(){
cria_arquivo();
return 0;
}
答案 0 :(得分:0)
我对你的问题感到困惑,但假设只有一个文件(arq,aluno.txt),并且每一行都有一个名字和一个等级,例如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main () {
FILE *arq;
arq = fopen ("aluno.txt", "rt");
if (arq == NULL) {
printf ("ERRO 404\n");
}
char name[50];
int grade;
while (fscanf (arq, "%s %d\n", &name, &grade) != EOF) {
if(name = "Fernando"){
//do what you want
if(grade < 6){
printf("Not good Fernando");
}
}
}
}
你想知道只有费尔南多等级,你可以这样做:
if df.empty:
df = bbg_historicaldata(t, f, startDate, endDate)
print(df)
datesArray = list(df.index)
tArray = [t for i in range(len(datesArray))]
arrays = [tArray, datesArray]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['TICKER', 'DATE'])
df = pd.DataFrame({f : df[f].values}, index=index)
else:
temp = bbg_historicaldata(t,f,startDate,endDate)
print(temp)
datesArray = list(temp.index)
tArray = [t for i in range(len(datesArray))]
arrays = [tArray, datesArray]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['TICKER', 'DATE'])
temp = pd.DataFrame({f : temp[f].values}, index=index)
#df = df.append(temp, ignore_index = True)
df = pd.concat([df, temp], axis = 1).sortlevel()
关于这种方法的好处是,它将逐行运行并获取每一行的名称和等级,直到它结束。因为fscanf()函数的作用是获取每一行的信息,然后移动到下一行并在文件结束时返回EOF。