我正在努力翻译。 这是我将文本文件中的所有字符串放在内存中的部分。 但程序会忽略文本文件的第一个字符串。
#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);
}
答案 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()
加倍分配。