Чтение комбинаций строки и целого числа из файла в C
Я новичок в языке C, поэтому, пожалуйста, потерпите меня. Я пытался прочитать файл, который содержит строки, но полученный вывод является одним символом.
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define CALLOC(num, type) ((char*)calloc (num, sizeof(char)))
#define FREE(addr) (free((void*) (addr)))
int i, count;
char *x, *y, *z;
int main (void)
{
FILE *stream;
if ( (stream = fopen ( "test.txt", "r" )) == NULL )
{ printf ("Cannot read the new file\n");
exit (1);
}
count = 3;
x=CALLOC(count, char);
y=CALLOC(count, char);
z=CALLOC(count, char);
for ( i=0; i<count; i++ )
{ fscanf (stream,"%c %c %c", &x[i], &y[i], &z[i]);
printf ("\n %d %c %c %c ", i, x[i], y[i], z[i]);
}
FREE(x);
FREE(y);
FREE(z);
fclose (stream);
}
Входной файл test.txt содержит
1 ab 1
2 aa 5
1 cc 1
токовый выход
0 1 a b
1 1 2
2 a a
Ожидаемый результат
0 1 ab 1
1 2 aa 5
2 1 cc 1
Я сомневаюсь, должен ли я использовать массив символов, но он, кажется, не работает, и я чувствую, что чтение int с использованием char является приемлемым. Здесь мне требуется ожидаемый результат, для этого приветствуется любой метод / предложение.
3 ответа
%c
читает только один символ Так что читать не собираюсь ab
как один символ Ваши строки в файле и ваши форматы неправильно читают всю строку.
Простой подход заключается в использовании fgets()
и распечатать всю строку:
char line[256];
i = 0;
while(fgets(line, sizeof line, stream))
{
printf ("%d %s", i, line);
i++;
}
Кстати, макросы для calloc
а также free
не нужны. Они действительно не делают код легче для чтения, чем непосредственно с помощью этих функций.
Проблема в том, что у вас есть файл сканирования. %c прочитал 8-битное значение. Вы отсканировали 3 символа, но файл содержит 4 символа. Если вы не используете значение x, y, z, я не понимаю, зачем использовать malloc.
Вот рабочий источник:
#include <stdio.h>
#include <stdlib.h>
int main() {
int count,i;
char w,x,y,z;
FILE *stream;
if((stream = fopen("test.txt","r")) == NULL) {
printf("Cannot read the new file\n");
return 1;
}
count = 3;
for(i=0;i<count;++i) {
fscanf(stream,"%c %c%c %c\n",&w,&x,&y,&z);
printf("%d %c %c%c %c\n",i,w,x,y,z);
}
return 0;
}
for ( i=0;i<count; i++ )
{
fscanf (stream,"%s %s %s", x, y, z);
printf ("\n %d %s %s %s ", i, x, y, z);
}
Вы можете изменить свой цикл на этот. Этот цикл будет читать файл до end of file
и вы должны использовать %s
как ab
является строкой, а не символом, поэтому ее нельзя сохранить в переменной char.