2016-12-02 6 views
0

Я пытаюсь прочитать файл test.txt через fscanf и сохранить его в массиве struct. Я опубликовал код, который я попробовал. Похоже, проблема здесь с функцией нагрузкиC Программирование: чтение из файла и печать на экране

Это то, что я имею в test.txt:

205,11.20,John Snow 
336,23.40,Winter is coming 
220,34.20,You know nothing 

функция нагрузка использует loadinput функцию для чтения файла test.txt в «пункте» массив и устанавливает цель «NoPtr» на количество элементов, считанных из файла (что в данном случае должно быть 3).

После прочтения файла, я также пытаюсь распечатать его на экране, но это не сработает. Ничего не отображается вообще.

Эта программа компилируется. Что я здесь делаю неправильно?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct Item { 
    double value; 
    int unit; 
    char name[50]; 
}; 

int load(struct Item* item, char Name[], int* NoPtr); 
int loadinput(struct Item* item, FILE* data); 
void display(struct Item item, int variableA); 

int main(void) 
{ 
    struct Item FIN[3]; 
    int i, n; 
    load(FIN, "test.txt", &n); 
    for (i = 0; i < n; i++) 
    { 
     display(FIN[i],0); 
    } 
return 0; 
} 


int load(struct Item* item, char Name[], int* NoPtr) 
{ 
    struct Item ARR[3]; 
    int flagcheck; 
    FILE* fl; 
    fl = fopen("Name[]", "r"); 
    while (fl) 
    { 
     flagcheck = loadinput(&ARR, fl); 
     if (flagcheck < 0) 
     { 
      fclose(fl); 
      break; 
     } 
     else 
     { 
      *NoPtr++; 
     } 
    fclose(fl); 
    } 
return 0; 
} 

int loadinput(struct Item* item, FILE* data) 
{ 
    int ret = fscanf(data, "%d,%lf,", &item->unit, &item->value); 
    if (ret != 2) { 
      return -1; 
    } 
    fgets(item->name, sizeof item->name, data); 
    item->name[strlen(item->name)-1] = '\0'; 
    return 0; 
} 

void display(struct Item item, int variableA) 
{ 
printf("|%3d |%12.2lf| %20s |***\n", item.unit, item.value, item.name); 
return; 
} 
+5

'FOPEN ("Name []", "г");', а затем просто предположим, что работал с не проверяя никаких ошибок? 'Name []' является довольно странным именем файла ... – John3136

+2

Вы имеете в виду 'fopen (Name," r ");'? – bansi

+0

'item-> name [strlen (item-> name) -1]' Завершение строки с помощью 'strlen' в строке, которую вы пытаетесь завершить? – John3136

ответ

0

см починки демо - BLUEPIXY

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct Item { 
    double value; 
    int unit; 
    char name[50]; 
}; 

int load(struct Item* item, char Name[], int* NoPtr); 
int loadinput(struct Item* item, FILE* data); 
void display(struct Item item, int variableA); 

int main(void) { 
    struct Item FIN[3]; 
    int i, n; 
    load(FIN, "test.txt", &n); 
    for (i = 0; i < n; i++) { 
     display(FIN[i],0); 
    } 
    return 0; 
} 

int load(struct Item* item, char Name[], int* NoPtr){ 
    *NoPtr = 0; 
    int flagcheck; 
    FILE* fl; 
    fl = stdin;//fopen(Name, "r");//for ideone 
    while (fl){ 
     flagcheck = loadinput(&item[*NoPtr], fl); 
     if (flagcheck < 0){ 
      fclose(fl); 
      break; 
     } else { 
      ++*NoPtr; 
     } 
    } 
    return 0; 
} 

int loadinput(struct Item* item, FILE* data){ 
    int ret = fscanf(data, "%d,%lf,", &item->unit, &item->value); 
    if (ret != 2) { 
     return -1; 
    } 
    fgets(item->name, sizeof item->name, data); 
    item->name[strlen(item->name)-1] = '\0'; 
    return 0; 
} 

void display(struct Item item, int variableA){ 
    printf("|%3d |%12.2lf| %20s |***\n", item.unit, item.value, item.name); 
    return; 
}