【发布时间】:2017-08-19 07:18:03
【问题描述】:
我正在练习 C 函数、malloc、realloc 和文件。 该程序仍处于开始阶段,但完成后它应该执行用户决定的不同任务:主函数要求用户输入一个将其连接到程序不同功能的数字。
我的问题是函数“CaricaFile()”应该让用户输入文件名,加载这个记录了不同温度和时间的文件,并将这些数据加载到动态数组中;每次函数启动时,它都不允许我插入任何文件名,并且程序会继续出现“无效参数”错误。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define NOME_FILE_MAX 25
typedef struct {
short int ore;
short int minuti;
float temperatura;
}t_rilevazione;
t_rilevazione *rilevazioni;
int i = -1;
int dimrilevazione = sizeof(t_rilevazione);
int CaricaFile() {
char nome_file[NOME_FILE_MAX];
printf("Inserire il nome del file da caricare, estensione compresa: ");
fgets(nome_file, NOME_FILE_MAX, stdin);
for (int q = 0; nome_file[q] != '\0'; q++) {
if (nome_file[q] == '\n') nome_file[q] = '\0';
}
FILE *input_stream = fopen(nome_file, "r");
if (input_stream == NULL) {
perror("Impossibile trovare il file");
return 0;
}
else {
rilevazioni = malloc(dimrilevazione);
if (rilevazioni = NULL) {
perror("Problema con l'allocazione della memoria");
return 0;
}
i = 0;
while (feof(input_stream) != 1) {
fscanf(input_stream, "%d:%d\n", &rilevazioni[i].ore, &rilevazioni[i].minuti);
fscanf(input_stream, "%f", &rilevazioni[i].temperatura);
realloc(rilevazioni, (i + 1 * dimrilevazione));
if (rilevazioni == NULL) {
perror("Problema con la riallocazione della memoria");
return 0;
}
i++;
}
fclose(input_stream);
printf("File caricato con successo.\n");
return 1;
}
}
int StampaVettore() {
if (i >= 0) {
int p;
printf("I parametri registrati sono...\n");
for (p = 0; p != i; p++) {
printf("%d:%d\n%f\n", rilevazioni[p].ore, rilevazioni[p].minuti, rilevazioni[p].temperatura);
}
return 1;
}
else {
printf("Nessun valore registrato.\n");
return 0;
}
}
int OrdinaVettore() {
}
int CalcolaMedia() {
}
int RicercaOrario() {
}
int SalvataggioFile() {
}
int main(void) {
short int op;
do {
printf("Di seguito le operazioni che e' possibile effetuare con il programma:\n");
printf("[1] Carica un file di testo\n");
printf("[2] Stampa i record acquisiti dal file\n");
printf("[3] Ordina il vettore dei record del file\n");
printf("[4] Calcola la media delle temperature\n");
printf("[5] Ricerca un determinato orario\n");
printf("[6] Salva su file i record del programma\n");
printf("[0] Esci dal programma\n");
printf("Digitare il numero corrispondente all'operazione desiderata.\n");
do {
scanf("%d", &op);
if (op < 0 || op > 6) {
printf("Operazione non consentita. Riprovare\n");
}
} while (op < 0 || op > 6);
if (op == 1) CaricaFile();
if (op == 2) StampaVettore();
if (op == 3) OrdinaVettore();
if (op == 4) CalcolaMedia();
if (op == 5) RicercaOrario();
if (op == 6) SalvataggioFile();
if (op == 0) printf("Uscita in corso...");
} while (op != 0);
return 0;
}
奇怪的是,如果我单独将 CaricaFile 函数作为 Main 函数带到它自己的程序中,它可以毫无问题地工作(至少,有一些问题,但那是因为我仍然不能很好地理解如何使用动态数组等)
我能做什么?谢谢
【问题讨论】:
-
您是否使用过像 GDB 这样的调试器来查看问题所在?您还可以指出它给出了哪些错误消息。
-
while (feof(input_stream) != 1) {stackoverflow.com/q/5431941/905902 -
您好,感谢您的回答;事实是,即使使用 Visual Studio 2017 作为 IDE(所以我使用它的调试器)也不会显示真正的错误,因为程序编译没有任何问题,它不会崩溃等,但它只是跳过 fgets ,不要求用户插入文件名,并给出“无效参数”错误
标签: c function malloc dynamic-arrays realloc