9

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

试过这个(c是文件中带有char的变量):

if(c=="\0")

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

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

one
two
three

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

(注意我对 C++ 很陌生(并且自己编程))

4

4 回答 4

22

您想使用单引号:

if(c=='\0')

双引号 (") 用于字符串,即字符序列。单引号 (') 用于单个字符。

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

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

于 2014-05-18T20:52:29.403 回答
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,请记住,重要的不仅仅是行尾,还有内存分配。而且您必须小心不要超出缓冲区。

于 2014-05-18T21:05:45.377 回答
3

如果您使用的是 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读取文件行的​​示例。

std::ifstream但是如果程序是用 C++ 编写的,那么如果你使用类和 std::string函数std::getline来读取整行会更好。

于 2014-05-18T21:03:53.890 回答
1

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

如果 (c == '\n')

于 2014-05-18T20:56:06.847 回答