【问题标题】:unable to read data from txt file无法从txt文件中读取数据
【发布时间】:2021-10-08 12:44:13
【问题描述】:

这是第一个将用户数据写入文件的代码

#include<stdio.h>
#include<conio.h>
void main()
{
   FILE *fpr;
   char ch='y';
   struct student 
   {
       int reg;
       char name[50],remarks[10];
   };
   struct student a;
   fpr=fopen("recstruct.txt","wb");
   if(fpr==NULL)
   {
       printf("file does not exist");
   }
   while (ch=='y')
   {
       printf("enter the register number ,name and remarks:\n");
       scanf("%d",&a.reg);
       scanf("%s",&a.name);
       scanf("%s",&a.remarks);
       
       fwrite(&a,sizeof(a),1,fpr);
       printf("do you want to add more record (y/n):\n");
       ch=getche();
       printf("\n\n");
   }
   fclose(fpr);
   
  }

我给出的输入是:

1
charana
pass
y

2
charana
pass

运行正常,但文本文件保存为以下格式:

   charana                     Ð>*  ùjö       pass         charana                     
Ð>*  ùjö       pass      

这里的第二个程序是从保存的文本文件中读取用户定义的寄存器编号,然后显示该特定寄存器编号的详细信息,例如名称和备注。

#include<stdio.h>
  void main()
    {
    struct studentdata
    {
        int reg;
        char name[50],remarks[50]; 
    }a;
     
    int reg,flag=0;
    char name;
    FILE * fpr;
    fpr=fopen("recstruct.txt","rb");
    if(fpr==NULL)
    {
        printf("file does not exist");
    }
    printf("enter the registration number:\n");
    scanf("%d",&reg);
    while(fread(&a,sizeof(a),1,fpr)>0 && flag==0)
    {
      if (a.reg==reg)
      {
          flag=1;
          printf("record found\n");
          printf("student name:%s registration number: %d\t  remarks:%s",a.name,a.reg,a.remarks);
      }

    }
    if (flag==0)
    {
        printf("record not found");
    }
    fclose(fpr);
    }

但是对于用户给出的除第一行数据以外的任何输入,程序都会返回“未找到”

enter the registration number:
2
record not found

我不知道问题出在哪里,是第一个程序还是第二个..请帮我解决同样的问题。

【问题讨论】:

  • 您正在写入二进制数据,所以请尝试使用“wb”和“rb”。
  • 试过了,还是有同样的问题
  • 在一个程序中有remarks[10],在另一个程序中有remarks[50]。使用通用头文件定义结构并在两个程序中使用该头文件。
  • 请将您的代码缩减为minimal reproducible example,并且不要同时提出多个问题。另外,您说生成的文件与预期的不一样,但是您期望什么?作为新用户,请拨打tour阅读How to Ask

标签: c file-handling


【解决方案1】:

您用于读取和写入的结构大小不同:

struct student 
{
    int reg;
    char name[50],remarks[10];
};

对比

struct studentdata
{
    int reg;
    char name[50],remarks[50]; 
}a;

具体来说,remarks 的大小不同。

【讨论】:

  • 谢谢,改结构后就可以了。
  • @CHARANA_GS 您可以通过单击答案左侧的复选标记将此答案标记为“已接受”。
  • @JohnnyMopp ,更新了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 2021-05-13
  • 2018-07-13
  • 2012-02-08
相关资源
最近更新 更多