如何从c中的txt文件正确扫描内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从c中的txt文件正确扫描内容相关的知识,希望对你有一定的参考价值。

这是我的代码,我想做的是从结构如下的文件中扫描fscanf:

Tom Veri 1234567890 HJA彼得·史密特(Peter Schmit)9874561230 ABAJhon Smart 0192837465 DPA哈里汤普森0912354876 PHA

并且在编译我的输出后,奇怪的是为什么会发生:代码如下

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

int nOfLines(FILE* file);

struct inputAbc
{
    char ime[20+1];
    char prezime[20+1];
    char jmbg[20+1];
    char sign[3+1];
};

int main()
{
    int nLines, i;
    FILE* input = NULL;
    FILE* output;
    struct inputAbc model_arr[10];

    input = fopen("input.txt", "r");
    output = fopen("output.txt", "w");
    nLines = nOfLines(input);
    //printf("%d
", nLines+1);

    for(i = 0; i < nLines+1; i++)
    {
        fscanf(input ,"%s %s %s %s", 
        model_arr[i].ime, model_arr[i].prezime, 
        model_arr[i].jmbg, model_arr[i].sign);
    }
    for(i = 0; i < nLines+1; i++)
    {
        fprintf(output, 
            "ime: %s
prezime: %s
jmbg: %s
znakovlje: %s

", 
            model_arr[i].ime, model_arr[i].prezime,
            model_arr[i].jmbg, model_arr[i].sign);
    }

    return 0;
}

int nOfLines(FILE *file)
{
    int lines = 0;
    int index;
    while(!feof(file))
    {
        index = fgetc(file);
        if(index == '
')
            lines++;
    }
    return lines;
}
答案

以下建议的代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 产生所需的输出
  4. 消除了一些“魔术”数字
  5. 消除不需要的变量
  6. 被评论以帮助OP理解代码
  7. fscanf()中使用'max character'修饰符,以避免任何可能的缓冲区溢出和导致的不确定行为
  8. 消除:#include <string.h>,因为在发布的代码中未使用任何关联的功能
  9. 退出前正确清理(通过关闭打开的文件)。
  10. 正确检查fopen()fscanf()的I / O错误
  11. 用于变量size_tij,因为它们永远不能小于0

现在,建议的代码:

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


struct inputAbc
{
    char ime[20+1];
    char prezime[20+1];
    char jmbg[20+1];
    char sign[3+1];
};

#define MAX_LINES    10


int main( void )
{
    FILE* input  = NULL;
    FILE* output = NULL;
    struct inputAbc model_arr[ MAX_LINES ];

    if( (input = fopen("input.txt", "r")) == NULL )
    {
        perror( "fopen to read 'input.txt' failed" );
        exit( EXIT_FAILURE );
    }

    // implied else, fopen for input successful
    if( (output = fopen("output.txt", "w") ) == NULL )
    {
        perror( "fopen to write 'output.txt' failed" );
        fclose( input );
        exit( EXIT_FAILURE );
    }

    // implied else, fopen for output successful
    size_t i;  // file global scope since needed in next code block
    for( i = 0; i < MAX_LINES; i++ )
    { 
        if( fscanf(input ,"%20s %20s %20s %3s", 
                model_arr[i].ime, 
                model_arr[i].prezime, 
                model_arr[i].jmbg, 
                model_arr[i].sign) != 4 )
        {
            break;
        }
    }

    for( size_t j = 0; j < i; j++ )
    {
        fprintf(output, 
            "ime: %s
prezime: %s
jmbg: %s
znakovlje: %s

", 
            model_arr[j].ime, 
            model_arr[j].prezime,
            model_arr[j].jmbg, 
            model_arr[j].sign);
    }

    fclose( input );
    fclose( output );

    return 0;
}

以上是关于如何从c中的txt文件正确扫描内容的主要内容,如果未能解决你的问题,请参考以下文章

编写一个程序, 将 a.txt 文件中的单词与 b.txt 文件中的 单词交替合并到 c.txt 文件中, a.txt 文件中的单词用回车符 分隔, b.txt 文件中用回车或空格进行分隔。(代码片段

c#修改文件内容

java代码实现从路径字符串中获取文件名称

使用扫描仪读取输入文件时“正确”操作“光标”

从 Zip 文件中的文件中读取内容

如何修改HOSTS文件内容