在txt文件C中搜索和写入

在txt文件C中搜索和写入,c,C,我需要帮助:/这个程序应该在txt文件中查找文本,如果文本在那里,然后生成另一个文本。 例如: 我随机生成 在ALUM_PROF值中插入2,4; 我在txt中查找,如果找到了这个文本,如果没有,我就把它写在txt中 然后产生 在ALUM_PROF值中插入5,7; 我在txt中查找,如果不是,我在txt中写入 然后产生 在ALUM_PROF值中插入2,4; 我在txt中查找它,就像在中一样,然后我不写它,我再次生成另一个 int NUMEROS_AL_PROFE(); #define fila 1

我需要帮助:/这个程序应该在txt文件中查找文本,如果文本在那里,然后生成另一个文本。 例如:

我随机生成 在ALUM_PROF值中插入2,4; 我在txt中查找,如果找到了这个文本,如果没有,我就把它写在txt中

然后产生 在ALUM_PROF值中插入5,7; 我在txt中查找,如果不是,我在txt中写入

然后产生 在ALUM_PROF值中插入2,4; 我在txt中查找它,就像在中一样,然后我不写它,我再次生成另一个

int NUMEROS_AL_PROFE();
#define fila 100 

int main()
{
    char aux[200];
    char aux2[200];
    int contador=0;
    FILE *f;
    f = fopen("prueba.txt","a+"); 
    if(f==NULL)
    {
        printf("no se ha podido abrir el archivo");
        exit(1);
    }

    int i,num_prof,num_alum=1;

    num_prof = NUMEROS_AL_PROFE();
    fprintf(f,"INSERT INTO ALUM_PROF VALUES (%d,%d);\n",num_alum,num_prof); //escribo en el fichero f
    num_alum++;

    for(i=0;i<fila;i++)
    {
        num_prof = NUMEROS_AL_PROFE();
        sprintf(aux,"INSERT INTO ALUM_PROF VALUES (%d,%d);\n",num_alum,num_prof); //almaceno el valor en aux

        while(!feof(f))
        {
            fgets(aux2,200,f); //I read from the file f and I keep each line in aux2

            if(strcmp(aux,aux2) == 0 ) //If a1 and a2 are equal then it is repeated.
            {
                contador=1;
            }
            memset(aux2, '\0',200);  //Vacio el array aux2
        }
        memset(aux, '\0',200);
        if(contador==0)
        {
            fprintf(f,"INSERT INTO ALUM_PROF VALUES (%d,%d);\n",num_alum,num_prof);
        }

        num_alum++;
    }
    fclose(f);
}
//Random Number
int NUMEROS_AL_PROFE()
{
    int num;
    num = rand() % 17 + 1; //Numeros aleatorios entre 1 y 17
    num = num + 1; 
    return num;
}

程序进行编译,并且在运行时保持加载状态,它不会写入任何内容并生成大量的txt。

您需要重置文件的读取位置和contador标志

修复代码示例:

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

#define fila 100

int NUMEROS_AL_PROFE(void);

int main(void){
    char aux[200];
    char aux2[200];
    int contador=0;
    FILE *f  = fopen("prueba.txt","a+"); 

    if(f==NULL) {
        printf("no se ha podido abrir el archivo");
        exit(1);
    }

    int num_alum = 1;

    srand(time(NULL));//Change seed of random number
    for(int i = 0; i < fila; i++){
        sprintf(aux,"INSERT INTO ALUM_PROF VALUES (%d,%d);\n", num_alum++, NUMEROS_AL_PROFE());

        rewind(f);//The file reading position is set to the beginning.
        contador = 0;//reset flag
        while(fgets(aux2, sizeof aux2, f)){//while(!feof(f)) has a problem. It has already been pointed out by stackptr's comment.
            if(strcmp(aux, aux2) == 0 ){
                //fprintf(stderr, "DEBUG:already exist %s", aux);
                contador = 1;
                break;
            }
        }
        if(contador == 0){
            //fprintf(stderr, "DEBUG:write %s", aux);
            fputs(aux, f);
        }
    }
    fclose(f);
}

int NUMEROS_AL_PROFE(void){
    int num;
    num = rand() % 17 + 1;
    num = num + 1; 
    return num;
}

不要将你的函数命名为ALLCAPS。这只适用于宏和常量;我试过使用链接代码,但也不起作用:在标识符、文本、文件名和注释中混合使用英语和{locale}是不好的做法。不是一个,就是另一个。因为第三方函数是英文的,如果你想要一致的可读性,就使用它。而且代码不需要在FGET和FPUT之间进行定位操作,因为这是明确允许的,FGET返回一个指示EOF和FPUT的空指针。通常-这是一个例外-在模式中,您需要在每次读写或写读操作之间进行定位操作rewind、fseek等,以+打开文件进行更新。这是最好的!!!!!谢谢,兄弟,我的错误就在这里,而我却错过了最后一次。