Чтение строки по char до конца строки C/C++

Как читать строку по одному символу за раз и останавливаться, когда вы достигаете конца строки? Я использую функцию fgetc для чтения из файла и помещения символов в массив (последний изменит массив на malloc), но не могу понять, как остановиться, когда будет достигнут конец строки.

Пробовал это (c - это переменная с char из файла):

if(c=="\0")

Но выдает ошибку, что я не могу сравнить указатель с целым числом

Файл выглядит так (длина слов неизвестна):

one
two
three

Итак, вот вопросы: 1) Могу ли я сравнить c с \0, поскольку \0 - это два символа (\ и 0) или он считается за один (тот же вопрос с \n) 2) Может быть, мне следует использовать \n ? 3) Если приведенные выше предложения неверны, что бы вы предложили (обратите внимание, я должен читать строку по одному символу за раз)

(Обратите внимание, что я новичок в C++ (и сам программирую))


person user3102621    schedule 18.05.2014    source источник
comment
В вашем вопросе говорится о C/C++, но чтение строки текста из файла на C++ намного проще, чем на C. Примете ли вы ответ, который относится только к C++? Потому что это тривиально в C++ и много строк в C, учитывая, что вам нужно динамически выделять память и т. д.   -  person Ray Toal    schedule 19.05.2014


Ответы (4)


Вы хотите использовать одинарные кавычки:

if(c=='\0')

Двойные кавычки ("") предназначены для строк, представляющих собой последовательности символов. Одинарные кавычки (') предназначены для отдельных символов.

Однако конец строки представлен символом новой строки, то есть '\n'.

Обратите внимание, что в обоих случаях обратная косая черта не является частью символа, а просто способом представления специальных символов. Используя обратную косую черту, вы можете представлять различные непечатаемые символы, а также символы, которые иначе запутали бы компилятор.

person Vaughn Cato    schedule 18.05.2014
comment
Спасибо, это не дает мне ошибки в этом месте, но какая разница между и '? - person user3102621; 19.05.2014
comment
@user3102621: user3102621: я добавил в свой ответ больше, чтобы объяснить. Дайте мне знать, если это все еще не ясно. - person Vaughn Cato; 19.05.2014
comment
Спасибо, чувак, основная проблема, которую я нахожу в программировании, это незнание чего-то простого, но все же очень раздражающего: D Еще раз спасибо! - person user3102621; 19.05.2014
comment
@ user3102621: Вы не одиноки. Это требует времени. Держись! Не сдавайся! - person Vaughn Cato; 19.05.2014
comment
Будет ли символ '\n' в конце строки делать мою программу переносимой и работать на компьютерах с Windows? - person Accountant م; 03.04.2019
comment
@бухгалтер вообще да. - person Vaughn Cato; 03.04.2019

Ответ на ваш исходный вопрос

Как читать строку по одному символу за раз и останавливаться, когда вы достигаете конца строки?

в C++ очень просто, а именно: используйте getline. По ссылке показан простой пример:

#include <iostream>
#include <string>
int main () {
  std::string name;
  std::cout << "Please, enter your full name: ";
  std::getline (std::cin,name);
  std::cout << "Hello, " << name << "!\n";
  return 0;
}

Вы действительно хотите сделать это на C? Я бы не стал! Дело в том, что в C вам нужно выделить память для размещения символов, которые вы читаете? Сколько персонажей? Вы не знаете заранее. Если вы выделяете слишком мало символов, вам придется каждый раз выделять новый буфер, чтобы понимать, что вы читаете больше символов, чем выделили для него место. Если вы перераспределяете, вы тратите место впустую.

C — это язык низкоуровневого программирования. Если вы новичок в программировании и написании простых приложений для построчного чтения файлов, просто используйте C++. Он делает все это распределение памяти для вас.

На ваши более поздние вопросы относительно "\0" и конца строки в целом ответили другие, и они применимы как к C, так и к C++. Но если вы используете C, помните, что важен не только конец строки, но и распределение памяти. И вам нужно быть осторожным, чтобы не переполнить буфер.

person Ray Toal    schedule 18.05.2014
comment
Я буду использовать С++ (написал malloc, потому что я не знаю ничего лучше в С++, чем он (но я слышал, что рекомендуется использовать что-то еще (поищу это позже в процессе :) ))) Спасибо за помощь ! - person user3102621; 19.05.2014
comment
В C вы можете использовать int getc(FILE*) и стек функций, чтобы получить точное количество байтов для выделения в одном выделении. Ограничением является максимальный размер стека, поэтому он не будет работать для огромных файлов, но, безусловно, выполним. - person Marcus Harrison; 05.09.2017

Если вы используете функцию C fgetc, вы должны проверить следующий символ, равен ли он символу новой строки или EOF. Например

unsigned int count = 0;
while ( 1 )
{
   int c = fgetc( FileStream );

   if ( c == EOF || c == '\n' )
   {
      printF( "The length of the line is %u\n", count );
      count = 0;
      if ( c == EOF ) break;
   }
   else
   {
      ++count;
   }
}    

или, может быть, было бы лучше переписать код, используя цикл do-while. Например

unsigned int count = 0;
do
{
   int c = fgetc( FileStream );

   if ( c == EOF || c == '\n' )
   {
      printF( "The length of the line is %u\n", count );
      count = 0;
   }
   else
   {
      ++count;
   }
} while ( c != EOF );

Конечно нужно вставить свою обработку прочитанных xgaracters. Это всего лишь пример того, как вы можете использовать функцию fgetc для чтения строк файла.

Но если программа написана на C++, то было бы намного лучше, если бы вы использовали классы std::ifstream и std::string и функцию std::getline для чтения целой строки.

person Vlad from Moscow    schedule 18.05.2014

Текстовый файл не имеет \0 в конце строк. У него есть \n. \n — это символ, а не строка, поэтому он должен быть заключен в одинарные кавычки.

if (c == '\n')

person ScottMcP-MVP    schedule 18.05.2014
comment
Это может быть еще сложнее: en.wikipedia.org/wiki/Newline - person Sany; 23.02.2021