因此,假设一个文件有多行,每行包含一个单词。我想将每个单词的字符存储在数组的每一行中。下面的代码显然不起作用,因为-i在每个循环中都为零,并且程序再次开始在数组的第1个位置存储字符。代码是:
while(1)
{
if(fgets(str, 50, fp) == NULL)
break;
for(i=0; i<strlen(str); i++)
p[i] = str[i];
}
答案 0 :(得分:1)
像这样解决文件读取循环;
while (fgets(str, sizeof(yourString), fp) != NULL)
{
yourString[strlen(yourString) - 1] = '\0'; // delete the new line
printf("%s\n", yourString);
}
因此,只需在上面的代码中,您的while
循环将起作用,直到文件中没有其他行要读取为止。在while
循环的每一回合中,它将从文件中取出一行,并将其添加到yourString
char数组中。请注意,fgets()
还将为文件中的每一行都使用换行符(\n
),因此我们需要在数组中添加另一行之前将其从数组中删除。
在while
循环之前,您需要声明一个char
数组以在其中存储每一行,例如;
char yourString[stringSize];
您需要为阵列确定一个stringSize
,以使其具有足够的存储空间来存储文件。
答案 1 :(得分:1)
您为p有单独的计数器变量,并不断对其进行递增以避免 覆盖,如下所示。
int write_position = 0;
while(1)
{
if(fgets(str, 50, fp) == NULL)
break;
for(i=0; i<strlen(str); i++)
p[write_position++] = str[i]; // you will not lose previous ones here
}
在数组p的末尾长度等于write_position
答案 2 :(得分:0)
以下建议的代码段
现在是建议的代码:
#define MAX_LINE_LEN 50
char **p;
p = calloc( NUM_LINES_IN_FILE, sizeof( char * ) );
if( !p )
{
perror( "calloc failed" );
exit( EXIT_FAILURE );
}
// implied else, calloc successful
FILE *fp;
if( !(fp = fopen ( "inputFileName", "r" )) )
{
perror( "fopen failed" );
exit( EXIT_FAILURE );
}
// implied else, fopen successful
char str[ MAX_LINE_LEN ];
for( int i=0; fgets(str, sizeof( str ), fp); i++ )
{
// remove trailing newline char
str[ strcspn( str, '\n' ) ] = '\0';
p[i] = strdup( str );
}
fclose( fp );