【问题标题】:C Programming: Read from file and print on screenC 编程:从文件中读取并在屏幕上打印
【发布时间】:2016-12-02 05:23:12
【问题描述】:

我正在尝试通过 fscanf 读取文件 test.txt 并将其存储在结构数组中。我已经发布了我尝试过的代码。看起来这里的问题是 load function

这是我在 test.txt:

中的内容
205,11.20,John Snow
336,23.40,Winter is coming
220,34.20,You know nothing

load 函数使用 loadinput 函数将 test.txt 文件读入“item”数组,并将 “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;
}

【问题讨论】:

  • fopen("Name[]", "r"); 然后假设它在没有错误检查的情况下工作? Name[] 是一个非常奇怪的文件名...
  • 你的意思是fopen(Name, "r"); 吗?
  • item-&gt;name[strlen(item-&gt;name)-1] 在您要终止的字符串上使用strlen 来终止字符串?
  • @John 那不是你所做的。您正在打开可能不存在的“Name[]”,但您还是从中读取了。这是一个相当大的问题......
  • 啊!对不起fclose(fl); break; --> break;

标签: c struct structure


【解决方案1】:

查看修复演示 - 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多