Вы можете прочитать строку и отсканировать ее, чтобы найти начало каждого столбца. Затем используйте данные столбца по своему усмотрению.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAX_COL 3
#define MAX_REC 512
int main (void)
{
FILE *input;
char record[MAX_REC + 1];
char *scan;
const char *recEnd;
char *columns[MAX_COL] = { 0 };
int colCnt;
input = fopen("input.txt", "r");
while (fgets(record, sizeof(record), input) != NULL)
{
memset(columns, 0, sizeof(columns)); // reset column start pointers
scan = record;
recEnd = record + strlen(record);
for (colCnt = 0; colCnt < MAX_COL; colCnt++ )
{
while (scan < recEnd && isspace(*scan)) { scan++; } // bypass whitespace
if (scan == recEnd) { break; }
columns[colCnt] = scan; // save column start
while (scan < recEnd && !isspace(*scan)) { scan++; } // bypass column word
*scan++ = '\0';
}
if (colCnt > 0)
{
printf("%s", columns[0]);
for (int i = 1; i < colCnt; i++)
{
printf("#%s", columns[i]);
}
printf("\n");
}
}
fclose(input);
}
Обратите внимание, что в коде все еще может использоваться некоторая надежная индикация: проверка на наличие ошибок в файлах с помощью ferror; убедитесь, что еф был поражен; убедитесь, что вся запись (все данные столбца) была обработана. Это также можно сделать более гибким, используя связанный список вместо фиксированного массива, и его можно изменить, чтобы он не предполагал, что каждый столбец содержит только одно слово (если столбцы ограничены определенным символом).