通过char读取字符串直到C / C ++行结束

时间:2014-05-18 20:50:50

标签: c++ c string file fgetc

如何在一个字符串中读取一个字符串,并在到达行尾时停止?我使用fgetc函数从文件读取并将字符放入数组(后者将数组更改为malloc),但无法弄清楚当到达行尾时如何停止

试过这个(c是来自文件的char变量):

if(c=="\0")

但它给出了错误,我无法将指针与整数

进行比较

文件看起来(单词的长度未知):

one
two
three

所以问题出现了: 1)我可以将c与\ 0进行比较,因为\ 0是两个符号(\和0),还是计为一个(与\ n相同的问题) 2)也许我应该使用\ n? 3)如果上面的建议有误,你会建议什么(注意我当时必须阅读一个字符串)

(注意我对C ++很新(并自己编程))

4 个答案:

答案 0 :(得分:19)

您想使用单引号:

if(c=='\0')

双引号(“)用于字符串,它是字符序列。单引号(')用于单个字符。

但是,行尾由换行符表示,即'\ n'。

请注意,在这两种情况下,反斜杠都不是字符的一部分,而只是表示特殊字符的方式。使用反斜杠可以表示各种不可打印的字符以及可能会使编译器混淆的字符。

答案 1 :(得分:4)

原始问题的答案

  

如何在一个字符串中读取一个字符串,并在到达行尾时停止?

在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,请记住它不仅仅是行尾,而是内存分配。而且你必须小心不要超过你的缓冲区。

答案 2 :(得分:2)

如果您正在使用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::ifstreamstd::string类并使用函数std::getline来读取整行就会好得多。

答案 3 :(得分:0)

文本文件的行尾没有\ 0。它有\ n。 \ n是一个字符,而不是字符串,因此必须用单引号括起来

if(c ==&#39; \ n&#39;)