【问题标题】:C Language: Search text file for a "word" and store the value into int and flout type variablesC 语言:在文本文件中搜索“单词”并将值存储到 int 和 flout 类型变量中
【发布时间】:2018-12-12 10:21:55
【问题描述】:

例如文本文件(vars.txt)包含:

var1
10
var2
3.54
var3
10110

我想读取文本文件并将 var1 的值(文本文件中 var1 之后的下一行)存储到我程序中的变量中。 我有以下代码,但似乎无法正常工作:

char cBuffer[256];
FILE *pSrcFile;
pSrcFile = fopen("vars.txt","r");
while( (fgets( cBuffer, 256 , pSrcFile)) != NULL )
{
    if( strcmp( cBuffer, "var1" ) != NULL )
    {
        sscanf( pSrcFile, "%d" , &var1 );
        printf("var1 is found= %d",var1);
        break;
    }
}

如何将文本文件的字符串转换并保存为 int、flout 和二进制类型变量?

换句话说,我想搜索文本文件以找到“var1”,然后将下一行(“var1”的值)保存到一个整数变量并重复此操作以搜索并存储“var2”的值到浮点变量和“var3”到二进制变量等等。

【问题讨论】:

    标签: c scanf fgets


    【解决方案1】:

    这是一个如何读取、写入文件的示例: //读取:

    FILE *f1, *f2;
    f1 = fopen("IN.INP","r");
    fscanf(f1,"%d",&vars);    
    fclose(f1);
    //Write:
    f2 = fopen("OUT.OUT", "w");
    fprintf(f2, "%d",vars);
    fclose(f2);
    

    我不确定我是否正确理解了您关于“如何将 .txt 转换为 int、float、二进制类型变量”的问题。但方法如下:

    char a = 10;
    int b = (int) a;
    

    但如果你只是想将 .txt 的值读入 int,float 则只需使用 fscanf(f1,"%d",&vars);//d for int

    【讨论】:

    • fscanf(f1,"%d",vars); --> fscanf(f1,"%d",&vars);
    • 我的错。谢谢
    • 好的,它有效。谢谢。我认为问题出在 sscanf 上,但 fscanf 可以正常工作!
    • 很高兴我能帮上忙
    【解决方案2】:

    我已经修改了你的程序以工作、检查和了解缺少的内容。

     #include<stdio.h>
     #include<string.h>
     #include<stdlib.h>
    
    int main()
    {
    
     char cBuffer[256]={'\0'};
     FILE *pSrcFile;
    
     pSrcFile = fopen("vars.txt","r");
     int var1;
     while((fgets(cBuffer, 256 , pSrcFile)) != NULL )
     {
        if(strncmp(cBuffer, "var1", sizeof("var1")-1 ) == 0 )
         {
           fscanf(pSrcFile, "%d" , &var1 );
           printf("var1 is found= %d\n",var1);
           break;
         }
      }
    

    }

    基本上添加了 strncmp() 以避免 bcBuffer 中有新行,否则它将不相等,因此 if() 不会为真,这不是标准的编程方式,而是使其工作的粗略方式(都可以'这里就不解释了)。

    【讨论】:

    • @MajidRafei 真的很抱歉......不确定任何编译器技巧,当我运行这个程序时,我看到输出为“var1 is found=10”
    • 但是,这对我很有帮助。我还有另一个问题;我已经为搜索创建了一个子功能,并在其中使用了您的代码。我在 main() 的开头打开了文本文件,并在 main() 的末尾进行了一些搜索并关闭了文本文件。可以看出,每次我调用 search() 函数和 fgets 时,它都会继续获取下一行(最后一次调用之后的下一行!),它不是从文本文件的最开头开始的。我该如何解决这个问题?我想从头开始阅读和搜索文本文件以找到每个“var”。
    • 谢谢,如果你想每次都从头开始,你必须使用 rewind() 或 fseek() API 将文件指针移动到开头,所以你必须像 fseek(pSrcFile, 0L, SEEK_SET) ,请参考 API 文档以了解更多关于 API 的信息
    【解决方案3】:

    最后,我找到了此代码问题的解决方案(感谢其他答案)。代码搜索 word 并返回 word 之后的下一个 value

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int search_word_int( char *word , FILE *file , int *step )
    {
        fseek(file, 0, SEEK_SET);
        char dummy[strlen(word)+1];
        int step_ = step;
        int variable = 0;
        while((fgets(dummy, strlen(word)+1 , file)) != NULL )
        {
            if(strncmp(dummy, word, strlen(word)+1 ) == 0 )
            {
                for (int i = 0 ; i < step_ + 1 ; i++)
                    fscanf(file, "%d" , &variable );
                printf("%s = %d\n",word,variable);
                break;
            }
        }
        return(variable);
    }
    
    float   search_word_float( char *word , FILE *file , int *step )
    {
        fseek(file, 0, SEEK_SET);
        char dummy[strlen(word)+1];
        int     step_ = step;
        float   variable = 0;
        while( (fgets( dummy , strlen(word)+1 , file )) != NULL )
        {
            if( strncmp(dummy, word, strlen(word)+1 ) == 0 )
            {
                for (int i = 0 ; i < step_ + 1 ; i++)
                    fscanf( file , "%f" , &variable );
                printf("%s = %f\n",word,variable);
                break;
            }
        }
        return(variable);
    }
    
    int main()
    {
        FILE    *file;
        file = fopen("vars.txt","r");
        int var1 = search_word_int( "var1" , file , 1 );
        float var2 = search_word_float( "var2" , file , 2 );
        fclose(file);
        return(0);
    }
    

    如果文本文件(“vars.txt”)是:

    var1
    10
    var2     2.3
    4.5
    

    那么结果是:

    var1 = 10
    var2 = 4.5
    

    空格、换行符和制表符将被忽略。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-13
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 1970-01-01
      • 2023-03-17
      • 2016-01-24
      • 1970-01-01
      相关资源
      最近更新 更多