【问题标题】:File not saving properly in C文件未在 C 中正确保存
【发布时间】:2018-05-08 05:01:55
【问题描述】:

我遇到的问题是数据没有正确存储, 我想要的是无论您何时运行代码,它仍然拥有信息。 这是我遇到问题的代码:

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
typedef struct{
int select;
char NoteNames[20];
char NoteTexts[200];
}Notes;
char Input[20];
bool RUN = true;
#define ARRAYLEN 2
Notes a[ARRAYLEN];
int main(void) {
    int i;
  FILE *fp;
  while(RUN == true){
  printf("\nWould you like to view notes or take notes?\n<view/take/leave>\n");
  scanf("%s",Input);
  if (strncmp(Input, "view",1)==0){
    fp = fopen ("Notes.dat", "a+");
    printf("Here are the notes\n\n");
    for(i=0; i<(ARRAYLEN-1); i++){
        fread(&a[i], sizeof(a), 1, fp );
        printf("%s : %s \n",a[i].NoteNames,a[i].NoteTexts);
    }
    fclose(fp);
  }
  if (strncmp(Input, "take",1)==0){
    fp = fopen ("Notes.dat", "a");
    printf("\nNote name : ");
    scanf("%s",a[i].NoteNames);
    printf("\nNote text : ");
    scanf("%s",a[i].NoteTexts);
    fclose(fp);
  }
  if (strncmp(Input, "leave",1)==0){
    RUN = false;
  }
  }
  return 0;
}

我尝试过更改 fopen 类型(即 r/r+ a/a+)之类的方法,但我无法找出代码有什么问题。 抱歉,如果我完全错了,这主要是我在互联网上可以找到的代码不匹配 xD。

编辑: 输出一切正常,符合我的预期,但问题是我说的数据没有被保存。

---HERE IS WHAT IT OUTPUTS---
Would you like to view notes or take notes?
<view/take/leave>
 take
Enter the notes name:
 lol
Enter the notes text:
 kek
Would you like to view notes or take notes?
<view/take/leave>
 view
lol : kek
Would you like to view notes or take notes?
<view/take/leave>
leave
>
---NEXT RUN---
Would you like to view notes or take notes?
<view/take/leave>
view
 : 
Would you like to view notes or take notes?
<view/take/leave>
---END OF OUTPUT---

【问题讨论】:

  • "a" 将文件指针设置为文件末尾,如果你想读/写然后使用 "r+" 或使用 fseek 来定位文件指针。
  • 您能告诉我们它正在做什么吗?向我们展示一些示例输入和输出?
  • 您的代码有很多没有意义的地方。例如,您有一个for 循环,似乎为您要阅读的每个条目运行一次。但是在循环中,您读取sizeof(a) 字节,这是数组的大小,而不是一个条目。另外,您还没有决定要使用的文件格式吗?你记录了吗?
  • 您忘记将数据写入文件,您只需打开并关闭它。 (而且你忘了初始化你的变量。)
  • 您需要写入文件。 a 用于追加。还要检查文件是否存在。

标签: c fopen


【解决方案1】:

您可以使用以下代码写入文件

FILE *fptr;
fptr = fopen("program.txt", "w");
if(fptr == NULL)
{ 
printf("Error!");
exit(1);
} 
printf("Enter a sentence:\n");
gets(sentence);
fprintf(fptr,"%s", sentence);
fclose(fptr);

并且 通过以下方式读取文件

char c[1000];
FILE *fptr;
if ((fptr = fopen("program.txt", "r")) == NULL) 
{
printf("Error! opening file");
//Program exits if file pointer returns NULL. 
exit(1);
} 
// reads text until newline fscanf(fptr,"%[^\n]", c); 
printf("Data from the file:\n%s", c); 
fclose(fptr);

【讨论】:

    【解决方案2】:

    仔细阅读您的代码并逐行检查:

    • 在第一个 if 中,您可以打开、读取和关闭文件。
    • 在第二个if 中,您只需打开然后关闭您的文件。
      • 没有写入它。

    【讨论】:

    • 请注意,第一个fopen() 将读/写位置放在文件末尾。文件中有多少数据并不重要——在 EOF 之后没有什么可读取的。 fopen() 应该使用"r" 或者"r+" 作为打开模式;如果文件不存在,+ 将创建文件(空)。
    【解决方案3】:

    使用 fprintf 将内容写入文件。

    【讨论】:

      猜你喜欢
      • 2021-11-23
      • 2020-07-29
      • 1970-01-01
      • 2014-12-08
      • 2021-03-05
      • 2015-03-12
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多