为什么fscanf会忽略第一个字符串?

时间:2016-01-22 05:11:36

标签: c

我正在努力翻译。  这是我将文本文件中的所有字符串放在内存中的部分。  但程序会忽略文本文件的第一个字符串。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct b
{
   char b[30];
}b;
int main()
{
    int d,c,i=0;
    char k[30],x;
    b *a;
    FILE *fp;
    if ((fp=fopen("translate.txt","r"))==NULL)
    {
       printf("Σφάλμα κατά το άνοιγμα του αρχείου\n");
    }
    else
    {
        while(!feof(fp))
        {
            fscanf(fp,"%s",k);
            i++;
        }
        a=malloc((i)*(sizeof(b)));
        fclose(fp);
    }
    if ((fp=fopen("translate.txt","r+"))==NULL)
    {
       printf("Σφάλμα κατά το άνοιγμα του αρχείου\n");
    }
    else
    {
        rewind(fp);
        for (c=0;c<i;c++)
       {
        fscanf(fp,"%s",a[c].b);
       }
       fclose(fp);
    }

2 个答案:

答案 0 :(得分:2)

1。您应该编写此循环(以便检查 a = ones(2,2); b = ones(2,2); c = ones(2,2); hcat(a,b,c) ## Does what I want by creating a single array. would be impracticable though for large number of objects. d = Array(Array{Float64,2}, 3); d[1] = a; d[2] = b; d[3] = c; hcat(d) ## Still leaves me with an array of arrays, like before [a b c] ## also does what I want [f for f in d] ## Still leaves me with an array of arrays 的返回) -

fscanf

as -

  for (c=0;c<i;c++)
  {
    fscanf(fp,"%s",a[c].b);
  }

2。 c=0; while (fscanf(fp,"%29s",a[c].b) == 1 && c<i){ ... c++; } 也是错误的,所以请使用while(!feof(fp))来控制循环 -

fscanf

注意 - 并且,为了避免混淆,请为结构成员和结构指定不同的名称。

答案 1 :(得分:0)

应用所有注释后,生成的代码为:

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



int main( void )
{
    char **lines = NULL;
    size_t lineCount = 0;
    FILE *fp = NULL;

    if ((fp=fopen("translate.txt","r"))==NULL)
    {
       perror("Σφάλμα κατά το άνοιγμα του αρχείου\n");
       exit( EXIT_FAILURE );
    }


    char * inputBuf = NULL;
    size_t inputLen = 0;

    while( getline( &inputBuf, &inputLen, fp ) )
    {
        lineCount++;
        char **tempLines = realloc( lines, (lineCount+1)*sizeof( char*) );
        if( !tempLines )
        { // then realloc failed
            perror( "realloc failed");
            free( lines );
            exit( EXIT_FAILURE );
        }

        lines = tempLines;
        lines[lineCount] = strdup( inputBuf );
        lineCount++;
    }

    fclose(fp);
    free( lines );
    return 0;
} // end function: main

但是,此代码效率不高,因为它反复调用realloc()

要解决这个问题,最初在lines[]中为多行提供足够的空间,比如说10,然后计算这些指针的使用数量。

当使用所有已分配的指针并需要添加另一行时,请通过realloc()加倍分配。