#c
#c
Вопрос:
По-видимому, это очень простая задача, но я боролся с ней в течение некоторого времени до сих пор.
Я инициализирую массив структур. Каждая структура состоит из двух массивов.
Затем я пытаюсь прочитать из файла и заполнить свой массив структур. Файл, состоящий из строк, представляет собой что-то вроде:
sign1 path1
sign2 path2
sign3 path3
Я получаю свою проблему при заполнении, а затем при печати моего массива.
Любая помощь настоятельно приветствуется.
Спасибо!
typedef struct {
char firma[333];
char path[100];
}riga;
void riempi_riga(riga* r, FILE* f1) {
//fscanf(f1, "%s %sn", r->firma, r->path);
fgets(r->firma, 33, f1);
fgets(r->path, 100, f1);
return;
}
void stampa_riga(riga* r) {
printf("%s %sn", r->firma, r->path);
return;
}
int num_lines(FILE *f1) {
char c;
int lines = 0;
while ((c = fgetc(f1)) != EOF)
if (c == 'n')
lines ;
if (c != 'n')
lines ;
rewind(f1);
return lines;
}
int main() {
riga* file_firme[1000];
int i = 0;
int j = 0;
FILE* f1;
f1 = fopen("C:\Users\blabla\Desktop\firmaMD5.txt", "r");
if (f1 == NULL) {
printf("non sono riuscito ad aprire il file!n");
return 0;
}
int num_righe = num_lines(f1);
for (i; i < num_righe; i )
riempi_riga(amp;file_firme[i], f1);
//riempi_riga(r1, f1);
//stampa_riga(r1);
//fflush(f1);
for (j; j < num_righe; j ) {
stampa_riga(amp;file_firme[j]);
}
if (fclose(f1) != 0)
printf("non sono riuscito a chiudere il filen");
return 0;
}
Комментарии:
1.
while ((c = fgetc(f1)) != EOF)
—>fgetc
возвращаетint
.c
должно бытьint
неchar
2. Спасибо! но это не решает мою проблему. Пожалуйста, любая дополнительная помощь?
3. «Я получаю свою проблему при заполнении, а затем при печати моего массива» в чем конкретно наша проблема? и, кстати, наличие имен переменных и текста на итальянском языке снижает ясность вопроса.
4. Да. Я знаю. Но с какой проблемой вы столкнулись? Я не вижу ничего плохого в том, что у вас есть. За исключением того, что вы можете захотеть:
fgets(r->firma, 333, f1);
вместоfgets(r->firma, 33, f1);
или лучше:fgets(r->firma, sizeof(r->firmat), f1);
5. Как форматируются ваши входные данные? Вам нужно прочитать всю строку с помощью
fgets
, а затем обозначить пробелы с помощьюstrtok
?
Ответ №1:
Кажется, ваш ввод находится в строках sign path
, где «знак» и «путь» разделены пробелом. Вы можете прочитать всю строку с помощью fgets
, а затем вызвать strtok
, чтобы получить два токена. Этот код не тестировался.
void riempi_riga(riga* r, FILE* f1)
{
char *tok;
char buf[sizeof(r->firma) sizeof(r->path)];
if (fgets(buf, sizeof(buf), f1) != NULL)
{
if ((tok = strtok(buf)) != NULL)
{
strncpy(r->firma, tok, sizeof(r->firma));
r->firma[sizeof(r->firma)-1]=0;
if ((tok = strtok(NULL)) != NULL)
{
strncpy(r->path, tok, sizeof(r->path));
r->path[sizeof(r->path)-1]=0;
}
}
}
}
Комментарии:
1. разве я не мог просто использовать fscanf(f1, «%s %s», r-> firma, r-> path)? в чем отрицательная сторона его использования? %s автоматически останавливается при встрече с пробелом, не так ли?
2.
fgets
считывает до новой строки. если вы хотите использовать различные функции scanf , я бы предложилfgets
plussscanf
. обязательно укажите максимальное количество символов в строке вашего формата %s.