Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修改在C上的文件中包含的变量?_C_Database_File - Fatal编程技术网

如何修改在C上的文件中包含的变量?

如何修改在C上的文件中包含的变量?,c,database,file,C,Database,File,我是一名新的编码员,技术上我今年开始编码,我需要大量的练习。不管怎样,我试图修改文件中的变量,但浏览器或CPU没有找到它。当我运行代码时,它可以写入变量并将其传递到文件并读取,但它不能修改文件中的变量。我试着用一段时间和一个if,但我的知识不能超过这些 问题在于删除功能,它可以读取文件或归档文件,但无法到达“文件结尾”,因为它显然不存在。代码主要读取一个打孔数字,当您在scanf上输入-1时停止。它读取所有数字(包括-1两次),然后将最后一个数字转换为零。问题是最后一个函数无限重复 #inclu

我是一名新的编码员,技术上我今年开始编码,我需要大量的练习。不管怎样,我试图修改文件中的变量,但浏览器或CPU没有找到它。当我运行代码时,它可以写入变量并将其传递到文件并读取,但它不能修改文件中的变量。我试着用一段时间和一个if,但我的知识不能超过这些

问题在于删除功能,它可以读取文件或归档文件,但无法到达“文件结尾”,因为它显然不存在。代码主要读取一个打孔数字,当您在scanf上输入-1时停止。它读取所有数字(包括-1两次),然后将最后一个数字转换为零。问题是最后一个函数无限重复

#include<stdio.h>
void Create(FILE *p){
p=fopen("c:Example", "rb");
if(!p){
    p=fopen("c:Example", "wb");
    printf("El texto fue creado \n");
    } else {
    printf("El texto ya existe \n");
    }
}
void Add(FILE *p){
int a;
p=fopen("c:Example", "ab");
if(p==NULL){
    printf("El texto no se encontro \n");
    } else {
    scanf("%d", &a);
    while(a!=-1){
        fwrite(&a, sizeof(int), 1, p);
        scanf("%d", &a);
        }
    fwrite(&a, sizeof(int), 1, p);
    }
fclose(p);
}
void Read(FILE *p){
int a;
p=fopen("c:Example", "rb");
if(p==NULL){
    printf("El texto no existe \n");
    } else {
    fread(&a, sizeof(int), 1, p);
    printf("%d \n", a);
    while(a!=-1){
        fread(&a, sizeof(int), 1, p);
        printf("%d \n", a);
        }
    }
fclose(p);
}
void Delete(FILE *p){
int a;
p=fopen("c:Example", "wb");
if(p==NULL){
    printf("El texto no existe \n");
    } else {
    fread(&a, sizeof(int), 1, p);
    printf("(1)\n");
    while(a!=-1){
        fread(&a, sizeof(int), 1, p);
        printf("(2)\n");
        }
    a=0;
    printf("(3)\n");
    }
fclose(p);
}

int main(){
FILE *p;
Create(p);
printf("\n");
Add(p);
printf("\n");
Read(p);
printf("\n");
Delete(p);
printf("\n");
Read(p);
printf("\n");
return 0;
}
#包括
无效创建(文件*p){
p=fopen(“c:示例”,“rb”);
如果(!p){
p=fopen(“c:示例”,“wb”);
printf(“El texto fue creado\n”);
}否则{
printf(“存在的文本”);
}
}
无效添加(文件*p){
INTA;
p=fopen(“c:示例”,“ab”);
if(p==NULL){
printf(“El texto no se encontro\n”);
}否则{
scanf(“%d”和“&a”);
而(a!=-1){
fwrite(&a,sizeof(int),1,p);
scanf(“%d”和“&a”);
}
fwrite(&a,sizeof(int),1,p);
}
fclose(p);
}
无效读取(文件*p){
INTA;
p=fopen(“c:示例”,“rb”);
if(p==NULL){
printf(“El texto no existe\n”);
}否则{
fread(&a,sizeof(int),1,p);
printf(“%d\n”,a);
而(a!=-1){
fread(&a,sizeof(int),1,p);
printf(“%d\n”,a);
}
}
fclose(p);
}
作废删除(文件*p){
INTA;
p=fopen(“c:示例”,“wb”);
if(p==NULL){
printf(“El texto no existe\n”);
}否则{
fread(&a,sizeof(int),1,p);
printf(“(1)\n”);
而(a!=-1){
fread(&a,sizeof(int),1,p);
printf(“(2)\n”);
}
a=0;
printf(“(3)\n”);
}
fclose(p);
}
int main(){
文件*p;
创建(p);
printf(“\n”);
加(p);
printf(“\n”);
阅读(p);
printf(“\n”);
删除(p);
printf(“\n”);
阅读(p);
printf(“\n”);
返回0;
}

问题的解决方案可能是读取数字并生成一个新文件,其中最后一个数字为-1,替换为0。然后删除旧文件并将临时文件重命名为旧文件。我写了一个解决方案,试图不改变你的代码太多。我建议您更好地了解fread()fwrite()函数的工作原理。在scanf函数之后,我使用getchar()函数从缓冲区中删除新行,这是在按enter键时产生的。还应尝试使用空格和缩进保持代码整洁

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

void Create (FILE *p)
{

    if((p = fopen ("c:Example", "wb")) == NULL) // Check if file opening doesn't fail
    {
        printf ("Can't open file\n");
        exit (-1);
    }

    printf ("File exists\n");

    fclose (p); //Close file pointer
}

 void Add(FILE *p)
{
    int a = 0; // Initialize variable

    p = fopen("c:Example", "ab");

    if (p == NULL) // File opening failed
    {
        printf("El texto no se encontro \n");
        exit (-1); // Program has to terminate
    } 
    else 
    {

        while(a != -1)
        {
            printf ("Please insert number\n"); //Tell user what to do
            scanf ("%d", &a);
            getchar();
            fwrite(&a, sizeof(int), 1, p);
        }
    }

    fclose(p);
}

void Read(FILE *p)
{
    int a = 0; // Initialize variable
    p = fopen("c:Example", "rb");

    if(p == NULL) // Error opening file
    {
        printf("El texto no existe \n");
        exit (-1); // Program has to termimate
    } 
    else 
    {
        while(a != -1)
        {
                fread(&a, sizeof(int), 1, p);
                printf("I've read %d\n", a);
        }
    }

    fclose(p);
 }

 void Delete(FILE *p)
 {
     int a = 0;
     p = fopen("c:Example", "r"); //Open for read

     if(p == NULL) // Can't open file
     {
         printf("El texto no existe \n");
         exit (-1); //Exit the program
     } 

     else 
     {
        FILE *temp;
        if ((temp = fopen ("temp", "ab")) == NULL) //Create a temp file in append mode
         {
             printf ("Error creating temp file\n");
             fclose (p);
             exit (-1);
         }

         while (a != -1)
         {
             fread(&a, sizeof(int), 1, p);

             if (a != -1)
             {
                  fwrite (&a, sizeof(int), 1, temp); // write to temp only if is not -1
             }
         }

         a = 0;
         fwrite (&a, sizeof (int), 1, temp); //Write 0 to last position

         fclose (temp);
         fclose (p);
         remove ("c:Example"); //Remove old file
         rename ("temp", "c:Example"); //Rename new file
         }
  }

  void Read_new (FILE * p)
  {
     int a = -1 // Initialize a as -1;
     p = fopen ("c:Example", "rb");

     while (a != 0)
     {
          fread (&a, sizeof (int), 1, p);
          printf ("I've read %d\n", a);
     }

    fclose (p);
 }

 int main()
 {
    FILE *p;
    Create(p);
    Add(p);
    Read(p);
    Delete(p);
    Read_new(p);
    return 0;
 }
#包括
#包括
无效创建(文件*p)
{
if((p=fopen(“c:Example”,“wb”))==NULL)//检查文件打开是否失败
{
printf(“无法打开文件\n”);
出口(-1);
}
printf(“文件存在\n”);
fclose(p);//关闭文件指针
}
无效添加(文件*p)
{
int a=0;//初始化变量
p=fopen(“c:示例”,“ab”);
if(p==NULL)//文件打开失败
{
printf(“El texto no se encontro\n”);
退出(-1);//程序必须终止
} 
其他的
{
而(a!=-1)
{
printf(“请插入号码”);//告诉用户该怎么做
scanf(“%d”和“&a”);
getchar();
fwrite(&a,sizeof(int),1,p);
}
}
fclose(p);
}
无效读取(文件*p)
{
int a=0;//初始化变量
p=fopen(“c:示例”,“rb”);
if(p==NULL)//打开文件时出错
{
printf(“El texto no existe\n”);
退出(-1);//程序必须终止
} 
其他的
{
而(a!=-1)
{
fread(&a,sizeof(int),1,p);
printf(“我读过%d\n”,a);
}
}
fclose(p);
}
作废删除(文件*p)
{
int a=0;
p=fopen(“c:Example”,“r”);//打开阅读
if(p==NULL)//无法打开文件
{
printf(“El texto no existe\n”);
退出(-1);//退出程序
} 
其他的
{
文件*temp;
if((temp=fopen(“temp”,“ab”))==NULL)//在追加模式下创建一个临时文件
{
printf(“创建临时文件时出错”);
fclose(p);
出口(-1);
}
而(a!=-1)
{
fread(&a,sizeof(int),1,p);
如果(a!=-1)
{
fwrite(&a,sizeof(int),1,temp);//仅当不是-1时才写入temp
}
}
a=0;
fwrite(&a,sizeof(int),1,temp);//将0写入最后一个位置
fclose(temp);
fclose(p);
删除(“c:示例”);//删除旧文件
重命名(“temp”,“c:Example”);//重命名新文件
}
}
无效读取新文件(文件*p)
{
int a=-1//将a初始化为-1;
p=fopen(“c:示例”,“rb”);
while(a!=0)
{
fread(&a,sizeof(int),1,p);
printf(“我读过%d\n”,a);
}
fclose(p);
}
int main()
{
文件*p;
创建(p);
加(p);
阅读(p);
删除(p);
读新(p);
返回0;
}

您应该检查
fread
的返回值。当到达文件末尾(EOF)时,它将返回0而不是1。然后,您可以调用该函数来确定未接收更多数据的原因是否是因为达到了EOF。