处理文件中的多行时无法记住的信息

时间:2018-12-13 13:46:59

标签: c

因此,假设一个文件有多行,每行包含一个单词。我想将每个单词的字符存储在数组的每一行中。下面的代码显然不起作用,因为-i在每个循环中都为零,并且程序再次开始在数组的第1个位置存储字符。代码是:

while(1)
{
    if(fgets(str, 50, fp) == NULL)
        break;
    for(i=0; i<strlen(str); i++)
        p[i] = str[i];
}

3 个答案:

答案 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)

以下建议的代码段

  1. 执行所需的功能
  2. 假设数组“ p []”是指向指针的char指针数组,并且包含(至少)足够多的条目来容纳输入文件中的所有行
  3. 输入文件中的任何行都不能超过48个字符+换行符

现在是建议的代码:

#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 );