2015-11-13 3 views
2

Я новичок в C и stackoverflow, поэтому простите меня, если мой вопрос глупый или дубликат.C строка исчезает вместе с символом новой строки

Итак, я попытался прочитать строки строки (и целые числа) из .txt-файлов и сохранить их в массив кортежей. Строки, считанные из файла, как представляется, содержат «\ n» каждый раз, поэтому я использую strcspn(), чтобы удалить его.

FILE* f = fopen("board.txt","r"); 
    int x; 
    size_t size = 30; 
    char *buffer; 
    for (i=1;i<=32;i++) 
     { 
      buffer = (char *)malloc(size); 
      x = getline(&buffer,&size,f); 
      buffer[strcspn(buffer,"\n")] = 0; 
      A[i].name = buffer; 
      buffer = (char *)malloc(size); 
      x = getline(&buffer,&size,f); 
      buffer[strcspn(buffer,"\n")] = 0; 
      A[i].type = buffer; 
      buffer = (char *)malloc(size); 
      x = getline(&buffer,&size,f); 
      A[i].price = atoi(buffer); 
     } 
    for (i=1;i<=32;i++) 
     printf("%s ",A[i].name); 
    for (i=1;i<=32;i++) 
     printf("%s ",A[i].type); 

Однако, когда я пробовал код выше, printf ничего не распечатывал. Но тогда, когда я пытался использовать \ n в printf (printf ("% s \ n", A [i] .type);), он работал отлично. Кажется, что строки полностью исчезают, когда я удаляю «\ n», а затем возвращаюсь только тогда, когда я нажимаю «\ n», когда я его печатаю.

Может кто-нибудь объяснить, что не так в коде? Или это проблема библиотеки? Заранее спасибо.

Редактирование: Поэтому, чтобы объяснить это немного дальше, мне нужно, чтобы эти строки (имя и тип) были напечатаны в «ящиках», чтобы сформировать вид настольной игры, поэтому я думаю, что приведение новой строки вызовет массу проблем позже на.

+0

Возможный дубликат [Почему Printf не вровень после вызова, если перевод строки не находится в строке формата?] (Http://stackoverflow.com/questions/1716296/why -does-printf-not-flush-after-the-call-except-a-newline-is-in-the-format-strin) –

+0

Что у вас есть против [0]? –

+0

ничего особенного ... на самом деле у него есть свой собственный идентификатор позже, поэтому, чтобы избежать путаницы, я пропустил 0 – SimpliCty

ответ

2

Это правильное поведение. «\ N» заставляет ОС сбрасывать буфер, используемый для печати, чтобы он отображался на stdout. Без «\ n» ОС не вынуждена записывать вашу печать в stdout.

+0

Спасибо за объяснение ... но есть ли способ сделать его как обычную строку, можно печатать без новая линия? – SimpliCty

+0

'fflush (stdout)' – chux

+0

Я имею в виду, как я могу вернуться в режим буферизации или что-то еще? Потому что позже я вставлю массив в список и распечатаю его часть по частям, и я до сих пор не понимаю понимания буферизации. Извините за глупый вопрос. – SimpliCty

0

printf относится к стандартной библиотеке ввода-вывода, это функция буферизации строк. Поэтому, когда эта функция вызывается, она хранит символы в буфере, и единственный способ получить вывод (в stdout) - закрасить символ новой строки. Таким образом, он был разработан таким образом, чтобы поддерживать минимальное количество системных вызовов, насколько это возможно.

Попробуйте устранения этого

buffer[strcspn(buffer,"\n")] = 0; 
+0

Да, но проблема в том, что мне действительно нужна эта строка без новой строки, и я до сих пор не понимаю, как вы можете вывести это простым способом. – SimpliCty

+0

Вы можете использовать 'setvbuf()' с режимом '_IONBUF' , Это заставляет функцию 'printf()' не дожидаться, пока ее буфер не будет заполнен до промывки. Это делает 'printf()' немедленно вызывать 'write()'. – jarr

Смежные вопросы