C++ primer plus学习笔记 --- 第6章、分支语句和逻辑运算符

6.1、if语句

if 语句是 C++ 中最基本的控制流语句之一。其用法如下:

if (condition) {
  // if 条件成立时执行的语句
}

其中 condition 是一个返回 bool 类型的表达式。当 condition 的值为 true 时,if 语句后面的代码块将会被执行;否则,if 语句后面的代码块将被跳过。

以下是一个简单的 if 语句的例子:

#include <iostream>

int main() {
  int x = 10;

  if (x > 5) {
    std::cout << "x is greater than 5" << std::endl;
  }

  return 0;
}

在上面的代码中,定义了变量 x 并将其初始化为 10。if 语句中的条件为 x > 5,因此 if 语句后的代码块被执行,并将 “x is greater than 5” 输出到标准输出流中。

在 if 语句中,如果只有一条语句需要执行,那么可以省略代码块的大括号。例如:

if (x > 5)
  std::cout << "x is greater than 5" << std::endl;

需要注意的是,省略大括号可能会导致代码可读性下降并引起错误,因此建议始终使用大括号。

在 if 语句中,条件表达式可以是任何返回 bool 类型的表达式,包括比较运算、逻辑运算、位运算等。例如:

if (x > 5 && x < 20) {
  std::cout << "x is between 5 and 20" << std::endl;
}

在上面的例子中,使用逻辑运算符 && 判断变量 x 是否同时大于 5 和小于 20,如果成立则执行后面的代码块。如果希望使用或运算,则可以使用 || 运算符。

6.1.1、if else语句

除了单独的 if 语句之外,C++ 中还有一种常见的 if else 语句,其用法如下:

if (condition) {  
  // condition 成立时执行的语句块
} else {
  // condition 不成立时执行的语句块
}

在上面的代码中,当 condition 为 true 时,执行 if 语句后的代码块;如果 condition 为 false,则执行 else 语句后的代码块。

以下是一个 if else 语句的例子,用于判断变量 x 是否为正数:

#include <iostream>

int main() {
  int x = -1;

  if (x > 0) {
    std::cout << "x is positive" << std::endl;
  } else {
    std::cout << "x is not positive" << std::endl;
  }

  return 0;
}

在上面的代码中,定义变量 x 并将其初始化为 -1。通过 if else 语句,判断 x 是否为正数。由于 x 的值小于等于 0,因此执行 else 语句后的代码块,并输出 “x is not positive” 到标准输出流中。

需要注意的是,在 if else 语句中,当条件 condition 成立时,只会执行 if 语句后的代码块,而不会执行 else 语句后的代码块。如果希望执行完 if 语句后,再执行 else 语句后的代码块,则可以使用两个独立的 if 语句,例如:

if (condition1) {
  // condition1 成立时执行的代码块
}
if (condition2) {
  // condition2 成立时执行的代码块
}

在上面的代码中,无论 condition1 是否成立,都会执行第一个 if 语句后的代码块;然后,如果 condition2 也成立,则会执行第二个 if 语句后的代码块。

6.1.2、格式化if else 语句

格式化 if else 语句可以使代码易于阅读和维护。以下是一些常见的格式化 if else 语句的技巧:

  1. 在 if 和 else 关键字后面加上空格。
  2. 将左括号紧贴着 if 和 else 关键字。
  3. 在每个代码块前面使用缩进,以使结构清晰、易于阅读。
  4. 对于 if 后面和 else 后面的代码块,使用花括号(大括号)括起来,即使代码块只有一条语句。

以下是一个格式化良好的 if else 语句的例子,用于判断一个整数是否为偶数:

#include <iostream>

int main() {
  int x = 5;

  if (x % 2 == 0) {
    std::cout << "x is even" << std::endl;
  } else {
    std::cout << "x is odd" << std::endl;
  }

  return 0;
}

在上面的代码中,if else 语句使用了缩进,使其结构变得清晰易读。每个代码块都被编写成了多行,并使用了花括号括起来以使代码清晰易懂。

需要注意的是,if else 语句的格式化方式可能因团队或个人的代码风格而异。重要的是让代码保持一致性,以方便团队成员阅读和维护代码。

6.1.3、if else if else 结构

在需要进行多条件判断时,可以使用 if else if else 结构。其语法如下:

if (condition1) {
  // condition1 成立时执行的语句块
} else if (condition2) {
  // condition1 不成立,condition2 成立时执行的语句块
} else if (condition3) {
  // condition1 和 condition2 都不成立,condition3 成立时执行的语句块
} else {
  // condition1, condition2 和 condition3 都不成立时执行的语句块
}

在上面的代码中,条件 condition1 为第一个条件,如果成立就执行 if 语句后的代码块。如果 condition1 不成立,就会接着判断 condition2,如果 condition2 成立,则会执行 else if 语句后的代码块,以此类推。如果所有条件都不成立,则执行 else 语句后的代码块。

以下是一个使用 if else if else 结构的示例,用于判断一个数字的正负性和零:

#include <iostream>

int main() {
  int x = 0;

  if (x > 0) {
    std::cout << "x is positive" << std::endl;
  } else if (x == 0) {
    std::cout << "x is zero" << std::endl;
  } else {
    std::cout << "x is negative" << std::endl;
  }

  return 0;
}

在上面的代码中,使用 if else if else 结构,依次判断 x 是否为正数、是否为零,以及是否为负数,并输出不同的文本信息。

需要注意的是,在 if else if else 结构中,每个条件都有可能被执行,如果一个条件被满足,则后面的条件将不再被判断,因此需要保证条件的顺序合理。

6.2、逻辑表达式

逻辑表达式是指可以返回 true 或 false 的表达式,它通常由以下逻辑运算符和比较运算符构成:

  1. 逻辑非运算符(!):将表达式取反,如果表达式为真,则逻辑非运算符返回假,反之亦然。
  2. 逻辑与运算符(&&):当两个表达式都为真时返回真,否则返回假。
  3. 逻辑或运算符(||):当至少一个表达式为真时返回真,否则返回假。
  4. 相等运算符(==):当两个操作数相等时返回真,否则返回假。
  5. 不等运算符(!=):当两个操作数不相等时返回真,否则返回假。
  6. 大于运算符(>):当左操作数大于右操作数时返回真,否则返回假。
  7. 大于等于运算符(>=):当左操作数大于等于右操作数时返回真,否则返回假。
  8. 小于运算符(<):当左操作数小于右操作数时返回真,否则返回假。
  9. 小于等于运算符(<=):当左操作数小于等于右操作数时返回真,否则返回假。

以下是一个简单的逻辑表达式的例子:

#include <iostream>

int main() {
  int x = 5, y = 7;

  bool result1 = x < y;              // true,x 小于 y
  bool result2 = !result1;           // false,result1 的逻辑非
  bool result3 = x == y || x < y;    // true,x 等于 y 或者 x 小于 y

  std::cout << result1 << std::endl;
  std::cout << result2 << std::endl;
  std::cout << result3 << std::endl;

  return 0;
}

在上面的代码中,定义了两个整数变量 x 和 y,并使用逻辑运算符和比较运算符构建了几个逻辑表达式。这些表达式的结果存储在布尔变量 result1result2 和 result3 中,并输出到标准输出流中。

需要注意的是,C++ 中的逻辑运算符和比较运算符可以结合使用,以构建更复杂的逻辑表达式。在构建复杂表达式时,优先级和结合性非常重要,需要使用小括号来明确运算的顺序。

6.2.1、逻辑运算符OR:||

逻辑运算符 OR(||)表示逻辑或,用于将逻辑表达式连接为一个新的逻辑表达式。它返回左右两个操作数中任意一个为 true 时结果为 true,否则结果为 false。

以下是一个使用逻辑运算符 OR 的示例,用于判断一个数字是否为正数或偶数:

#include <iostream>

int main() {
  int x = -2;

  if (x > 0 || x % 2 == 0) {
    std::cout << "x is positive or even" << std::endl;
  } else {
    std::cout << "x is negative and odd" << std::endl;
  }

  return 0;
}

在上面的代码中,使用逻辑运算符 OR 连接了两个逻辑表达式,判断 x 是否为正数或偶数。由于 x 的值为 -2,不是正数,但是是偶数,因此这个逻辑表达式返回 true,执行 if 语句后的代码块,输出 “x is positive or even”。

如果两个表达式都返回 false,那么逻辑表达式就会返回 false,执行 else 语句后的代码块。因此,在使用逻辑运算符 OR 时,请确保它们能够涵盖所有情况。

6.2.2、逻辑运算符AND:&&

逻辑运算符 AND(&&)表示逻辑与,用于将逻辑表达式连接为一个新的逻辑表达式。它返回左右两个操作数都为 true 时结果为 true,否则结果为 false。

以下是一个使用逻辑运算符 AND 的示例,用于判断一个数字是否为正偶数:

#include <iostream>

int main() {
  int x = 6;

  if (x > 0 && x % 2 == 0) {
    std::cout << "x is a positive even number" << std::endl;
  } else {
    std::cout << "x is not a positive even number" << std::endl;
  }

  return 0;
}

在上面的代码中,我们使用逻辑运算符 AND 连接了两个逻辑表达式,分别判断 x 是否为正数和偶数,只有当这两个表达式的结果都为 true 时,才会执行 if 语句后的代码块,输出 “x is a positive even number”。 因为 x 的值为 6,既是正数也是偶数,所以这个逻辑表达式返回 true。

需要注意的是,使用逻辑运算符 AND 时,如果左操作数为 false,右操作数就不会被计算,因为无论右操作数的值是什么,整个逻辑表达式的结果都必定为 false。这种行为被称为短路逻辑,它可以提高程序效率。

6.2.3、用&&来设置NOT运算符

在某些情况下,可以使用逻辑运算符 AND(&&)和逻辑非运算符(!)来设置逻辑非表达式,例如:

if (!(x > 0)) {
  std::cout << "x is not positive" << std::endl;
}

在上面的代码中,我们使用逻辑非运算符将 (x > 0) 的结果取反,表示 x 不是正数,如果表达式的结果为 true,就会执行 if 语句后的代码块,输出 “x is not positive”。

这种写法可能不够直观,但是可以在代码中减少逻辑非运算符的使用,使得代码更容易理解。

6.2.4、逻辑NOT运算符:!

逻辑非运算符(!)表示逻辑非,用于将一个逻辑表达式取反。如果表达式的结果为真,则逻辑非运算符返回假,反之亦然。例如:

bool b = false;

if (!b) {
  std::cout << "b is true" << std::endl;
}

在上面的代码中,定义了一个布尔变量 b 并将其赋值为 false。在 if 语句中,使用逻辑非运算符对 b 取反,因为 b 的值为 false,所以逻辑非运算符返回 true,执行 if 语句后的代码块,输出 “b is true”。

另外,需要注意的是,在使用逻辑非运算符时,应该格外注意优先级和结合性,否则可能会导致逻辑错误。通常,建议使用小括号来明确运算的顺序,例如:

if (!(x > y)) {
  std::cout << "x is not greater than y" << std::endl;
}

在上面的代码中,使用小括号明确了 x > y 的运算顺序,并将其取反,表示 x 不大于 y。如果省略小括号,则会先计算逻辑非运算符,导致结果与预期不符。

6.2.5、逻辑运算符细节

  • 优先级:逻辑非运算符优先级最高,其次是逻辑与运算符,最后是逻辑或运算符。但是,建议使用小括号明确运算优先级,减少出错的概率。
  • 结合性:逻辑与和逻辑或运算符都具有短路结合性,而逻辑非运算符没有。具体来说,当使用逻辑与运算符时,只有所有的操作数都为 true 才会返回 true,并且当任何一个操作数为 false 时就会停止计算,因为后面的操作数不影响结果了。而当使用逻辑或运算符时,只要有任何一个操作数为 true 就会返回 true,并且当任何一个操作数为 true 时也会停止计算,因为后面的操作数不影响结果了。逻辑非运算符则没有结合性,只翻转操作数的值。
  • 精度问题:逻辑运算符只针对布尔类型的操作数进行计算,不会转换其他数据类型。如果需要对其他数据类型进行逻辑运算,需要先将其转换为布尔类型。通常情况下,非零值会被视为 true,零值会被视为 false。

6.2.6、其他表达方式

在 C++ 中,逻辑运算符可以与赋值运算符(=)结合使用,形成复合运算符。

例如,逻辑与运算符和赋值运算符结合,形成 &= 运算符,逻辑或运算符和赋值运算符结合,形成 |= 运算符。这些复合运算符可以简化一些表达式的书写,提高代码可读性和效率。

以下是一个使用复合运算符的示例,用于统计一个数字的二进制表示中的 1 的个数:

#include <iostream>

int main() {
  int count = 0;
  int x = 12;

  while (x != 0) {
    count += x & 1; // 统计最后一位是否为 1
    x >>= 1; // 将最后一位删掉
  }

  std::cout << "The binary representation of 12 has " << count << " 1's" << std::endl;

  return 0;
}

在上面的代码中,我们使用逻辑与运算符和赋值运算符结合,将 count += x & 1; 简化为 count &= 1;,表示将 count 和 x & 1 的结果进行逻辑与运算并赋值给 count,这个表达式的作用是统计一个数字的二进制表示中最后一位是否为 1。

6.3、字符函数库cctype

字符函数库 cctype 是 C++ 标准库中专门用于处理字符的库,包含了一组关于字符分类(如大小写、字母、数字等)、转换和映射的函数。头文件为 <cctype>

在 cctype 库中,所有函数都以 is 或 to 为前缀,表示是字符类型判断还是字符转换函数。主要的函数有以下几种类型:

  • 字符类型判断函数:用于确定一个字符是否属于某个字符类型,返回 bool 类型的值。函数名以 is 开头,例如 isalphaisdigit
  • 字符转换函数:用于将一个字符转换为指定的大小写、数字、字符类型等等。函数名以 to 开头,例如 tolowertoupper
  • 其他函数:包含一些与字符处理相关的杂项函数,如 isspace(判断是否为空白字符)、ispunct(判断是否是标点符号)等等。

这些函数的用法与具体示例可以在 C++ 标准库文档中查阅。使用字符函数库可以方便地对字符进行操作,提高字符处理的效率。

6.4、?:运算符

?: 运算符也称为三目运算符,它是 C++ 中唯一的具有三个操作数的运算符。它的一般形式如下:

(condition) ? expression1 : expression2;

其中,condition 是一个布尔表达式(也可以是任何返回布尔值的表达式),expression1 和 expression2 是两个可能的表达式,用于根据 condition 的结果选择执行哪一个。

如果 condition 的结果为 true,则执行 expression1,否则执行 expression2expression1 和 expression2 必须具有相同的类型,结果将取决于所选表达式的类型。

下面是一个使用 ?: 运算符的示例,判断一个数是否是正数:

#include <iostream>

int main() {
  int x = -5;
  std::string result = (x > 0) ? "positive" : "non-positive";
  std::cout << x << " is " << result << std::endl;

  return 0;
}

在上面的代码中,我们使用 ?: 运算符判断 x 是否是正数。如果 x > 0 的结果为 true,则执行 (x > 0) ? "positive" : "non-positive",即将 “positive” 赋值给 result。否则执行 (x > 0) ? "positive" : "non-positive",即将 “non-positive” 赋值给 result。最后输出 x 和 result 的值。

6.5、switch语句

switch 语句是 C++ 中用于多分支判断的一种结构化语句,可以根据一个表达式的值来选择不同的分支执行。switch 语句的一般形式如下:

switch (expression) {
  case value1:
    // 执行语句1
    break;
  case value2:
    // 执行语句2
    break;
  case value3:
    // 执行语句3
    break;
  // ...
  default:
    // 执行默认语句
    break;
}

其中,expression 是一个表达式,它的值将会被和每一个 case 语句后面的 value 进行比较,如果相等,则执行该 case 语句后的语句,直到遇到一个 break 语句或者整个 switch 语句结束为止。如果所有的 case 语句都不满足,就会执行 default 语句。

break 语句用于跳出 switch 语句,避免执行后面的语句。default 语句是可选的,当所有 case 都不满足时才会执行它。

下面是一个使用 switch 语句的示例,根据星期几输出对应的工作日:

#include <iostream>

int main() {
  int day = 3;
  
  switch (day) {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
      std::cout << "It's a workday" << std::endl;
      break;
    case 6:
    case 7:
      std::cout << "It's a weekend" << std::endl;
      break;
    default:
      std::cout << "Invalid day" << std::endl;
      break;
  }
  
  return 0;
}

在上面的代码中,我们使用 switch 语句根据星期几输出对应的工作日。当 day 的值为 1 到 5 时,会执行 case 1 到 case 5 后面的语句,输出 “It’s a workday”。当 day 的值为 6 或 7 时,会执行 case 6 或 case 7 后面的语句,输出 “It’s a weekend”。如果 day 的值不在 1 到 7 之间,就会执行 default 后面的语句,输出 “Invalid day”。

6.5.1、将枚举量用作标签

在 switch 语句中,我们还可以使用枚举类型的值作为标签,来实现多分支判断。在这种情况下,每个枚举常量对应于一个标签,也可以使用 default 标签来处理不属于任何枚举常量的值。

下面是一个示例,使用枚举类型的值作为标签:

#include <iostream>

enum DayOfWeek { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };

int main() {
  DayOfWeek day = Wednesday;

  switch (day) {
    case Monday:
    case Tuesday:
    case Wednesday:
    case Thursday:
    case Friday:
      std::cout << "It's a workday" << std::endl;
      break;
    case Saturday:
    case Sunday:
      std::cout << "It's a weekend" << std::endl;
      break;
    default:
      std::cout << "Invalid day" << std::endl;
      break;
  }

  return 0;
}

在上面的代码中,我们使用枚举类型 DayOfWeek 定义七个常量,分别对应于每个星期几。在 switch 语句中,将 day 的值与各个常量进行比较,根据不同的常量输出不同的内容。

6.5.2、switch和if else语句

在处理多分支判断时,switch 语句可以与 if else 语句互相替换,但它们有一些不同的特性:

  • switch 语句只能用于整数类型的值或者枚举类型的值,而 if else 语句可以用于任何布尔类型的表达式;
  • switch 语句中的标签需要是常量表达式,不能是变量或者运行时计算的表达式,而 if else 语句中没有这个限制;
  • switch 语句会根据标签值跳转到对应的分支执行,因此执行效率较高,而 if else 语句需要逐个比较条件,效率相对较低。

由于 switch 语句和 if else 语句在使用上有一些差异,因此在实际编程中需要灵活选择并合理使用它们。

下面是一个使用 if else 语句的示例,根据星期几输出对应的工作日:

#include <iostream>

int main() {
  int day = 3;

  if (day >= 1 && day <= 5) {
    std::cout << "It's a workday" << std::endl;
  }
  else if (day == 6 || day == 7) {
    std::cout << "It's a weekend" << std::endl;
  }
  else {
    std::cout << "Invalid day" << std::endl;
  }

  return 0;
}

在上面的代码中,我们使用 if else 语句根据星期几输出对应的工作日。如果 day 的值在 1 到 5 之间,则输出 “It’s a workday”;如果 day 的值是 6 或 7,则输出 “It’s a weekend”;否则就输出 “Invalid day”。

6.6、break和continue语句

在 C++ 中,break 和 continue 语句用于控制程序执行流程。

break 语句用于跳出循环或 switch 语句,即在循环或 switch 语句内部执行 break 后,程序会直接跳出到循环或 switch 语句的外部继续执行后面的代码。

下面是一个使用 break 语句跳出循环的示例:

#include <iostream>

int main() {
  for (int i = 0; i < 10; i++) {
    std::cout << i << std::endl;
    if (i == 5) {
      break;
    }
  }

  std::cout << "End" << std::endl;

  return 0;
}

在上面的代码中,我们使用 for 循环输出 0~9 的数值,并在 i 的值等于 5 时使用 break 跳出循环。当 i 的值为 0~5 时,会输出对应的值。当 i 的值等于 5 时,执行 break 后跳出循环。最后输出 “End”。

continue 语句用于结束当前的迭代,即在循环体内执行 continue 后,程序会直接跳到循环头继续执行下一次循环。

下面是一个使用 continue 语句结束当前迭代的示例:

#include <iostream>

int main() {
  for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) {
      continue;
    }
    std::cout << i << std::endl;
  }

  return 0;
}

在上面的代码中,我们使用 for 循环输出 1~9 的奇数,并在 i 的值为偶数时使用 continue 结束当前迭代。当 i 的值为奇数时,会输出对应的值。当 i 的值为偶数时,执行 continue 后直接跳到循环头继续执行下一次循环。

6.7、读取数字的循环

在 C++ 中,我们可以使用 while 或 do while 循环来读取数字。通常情况下,我们需要检查输入是否合法,以确保程序不会因为非法输入而崩溃或者进入无限循环。

下面是一个使用 while 循环读取数字的示例:

#include <iostream>

int main() {
  int x;

  while (true) {
    std::cout << "Please enter a number: ";
    if (std::cin >> x) {
      std::cout << "You entered: " << x << std::endl;
      break;
    } else {
      std::cout << "Invalid input, please try again." << std::endl;
      std::cin.clear();
      std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
  }

  return 0;
}

在上面的代码中,我们使用 while 循环读取用户输入的数字,如果输入合法,则输出该数字并跳出循环;如果输入非法,则输出错误信息并继续循环。在读取非法输入后,我们使用 cin.clear() 清空输入流的状态,然后使用 cin.ignore() 忽略不合法的输入,以防错误的输入影响下一轮读取。

下面是一个使用 do while 循环读取数字的示例:

#include <iostream>

int main() {
  int x;

  do {
    std::cout << "Please enter a number: ";
    if (std::cin >> x) {
      std::cout << "You entered: " << x << std::endl;
      break;
    } else {
      std::cout << "Invalid input, please try again." << std::endl;
      std::cin.clear();
      std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }
  } while (true);

  return 0;
}

在上面的代码中,我们使用 do while 循环来读取用户输入的数字,如果输入合法,则输出该数字并跳出循环;如果输入非法,则输出错误信息并继续循环。这里的 do while 循环与 while 循环的区别在于,do while 循环至少会执行一次循环体,因此可以保证用户至少会输入一次。

6.8、简单文件输入/输出

在 C++ 中,我们可以使用 fstream 头文件提供的函数来进行简单的文件读取和写入操作。其中,ofstream 类用于写入文件,ifstream 类用于读取文件,fstream 类则同时具有读取和写入文件的能力。

下面是一个使用 ofstream 将数据写入文件的示例:

#include <iostream>
#include <fstream>

int main() {
  std::ofstream outfile("example.txt");

  if (outfile.is_open()) {
    outfile << "Hello, world!" << std::endl;
    outfile << "My favorite number is " << 42 << "." << std::endl;
    outfile.close();
    std::cout << "Data was written to the file." << std::endl;
  } else {
    std::cout << "Unable to open the file!" << std::endl;
    return 1;
  }

  return 0;
}

在上面的代码中,我们使用 ofstream 将数据写入名为 example.txt 的文件中。首先打开文件并判断是否成功打开,然后使用 << 运算符将字符和数字写入文件,将输出流关闭并输出 “Data was written to the file.”。

下面是一个使用 ifstream 读取文件的示例:

#include <iostream>
#include <fstream>
#include <string>

int main() {
  std::ifstream infile("example.txt");
  std::string line;

  if (infile.is_open()) {
    while (getline(infile, line)) {
      std::cout << line << std::endl;
    }
    infile.close();
    std::cout << "Data was read from the file." << std::endl;
  } else {
    std::cout << "Unable to open the file!" << std::endl;
    return 1;
  }

  return 0;
}

在上面的代码中,我们使用 ifstream 从名为 example.txt 的文件中读取数据。首先打开文件并判断是否成功打开,然后使用 getline 函数逐行读取文本内容并输出,最后关闭文件并输出 “Data was read from the file.”。需要注意的是,getline 函数返回的字符串不包含行结束符,因此在输出时要手动添加。

6.8.1、文本I/O和文本文件

在 C++ 中,我们可以使用流(stream)对象进行文本输入/输出(text I/O)操作。流是 C++ 标准库中的一个重要概念,它可以把数据源和数据目标包装成一个可操作的对象,使得输入/输出操作更加方便和统一。

文本文件通常包含纯文本,数据以字符的形式存储。我们可以使用流对象来进行文本文件的读取和写入操作。在涉及文件操作时,必须要确保文件打开成功,否则操作会失败。在文件操作完成后,需要关闭文件以释放资源。

下面是一个使用 fstream 头文件进行文本文件读写的示例:

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

int main() {
  // 打开文本文件
  ifstream infile("input.txt");
  ofstream outfile("output.txt");

  // 判断文件是否打开成功
  if (!infile.is_open() || !outfile.is_open()) {
    cout << "Failed to open file!" << endl;
    return 1;
  }

  // 读取文件内容并写入到另一个文件中
  string line;
  while (getline(infile, line)) {
    outfile << line << endl;
  }

  // 关闭文件
  infile.close();
  outfile.close();
  cout << "File operation completed successfully." << endl;

  return 0;
}

在上面的代码中,我们打开文件 input.txt 和 output.txt,通过 getline 函数逐行读取 input.txt 文件中的内容,并将每一行内容写入到 output.txt 文件中。在文件操作完成后,我们使用 close 函数关闭文件。

需要注意的是,C++ 中的文件 I/O 操作和 UNIX 系统中的文件 I/O 操作有一定的差异。在 UNIX 系统中,每个文件都被看作是一个字节流(byte stream),而在 C++ 标准库中,文件被看作是一系列字符(character)。因此,在 C++ 中,我们需要使用 fstream 类型的对象来进行文本输入/输出操作。

6.8.2、写入到文本文件中

在 C++ 中,我们可以使用 ofstream 类型的对象向文本文件写入数据。在使用 ofstream 向文件写入数据时,我们需要先打开文件,然后将数据写入文件,最后关闭文件。

下面是一个将数据写入到文本文件中的示例代码:

#include <fstream>
#include <iostream>

using namespace std;

int main() {
  // 创建并打开文本文件
  ofstream outfile("example.txt");

  // 判断文件是否打开成功
  if (!outfile.is_open()) {
    cout << "Failed to open file!" << endl;
    return 1;
  }

  // 向文件中写入数据
  outfile << "Hello, world!" << endl;
  outfile << "This is a sample text file." << endl;
  outfile << "Here is some more data." << endl;

  // 关闭文件
  outfile.close();

  cout << "Data has been written to the file." << endl;

  return 0;
}

在上面的示例代码中,我们创建一个名为 example.txt 的文本文件,并将三行文本数据写入到文件中。在文件写入完成后,我们使用 close 函数关闭文件。

需要注意的是,在进行文件 I/O 操作时,我们需要确保文件能够被成功打开。如果打开失败,我们需要返回错误信息并退出程序。此外,我们还应该在每次操作结束后及时关闭文件,以释放资源。

6.8.3、读取文本文件

在 C++ 中,我们可以使用 ifstream 类型的对象从文本文件中读取数据。在使用 ifstream 读取文件时,我们需要先打开文件,然后使用 getline 函数逐行读取文件内容,最后关闭文件。

下面是一个从文本文件中读取数据的示例代码:

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

int main() {
  // 打开文本文件
  ifstream infile("example.txt");

  // 判断文件是否打开成功
  if (!infile.is_open()) {
    cout << "Failed to open file!" << endl;
    return 1;
  }

  // 读取文件内容
  string line;
  while (getline(infile, line)) {
    cout << line << endl;
  }

  // 关闭文件
  infile.close();

  cout << "Data has been read from the file." << endl;

  return 0;
}

在上面的示例代码中,我们打开名为 example.txt 的文本文件,并使用 getline 逐行读取文件内容并输出到控制台上。在读取操作完成后,我们使用 close 函数关闭文件。

需要注意的是,在每次操作结束后及时关闭文件,以释放资源。如果文件打开失败,我们需要返回错误信息并退出程序。在读取文件时,我们可以使用 getline 函数逐行读取文本文件的内容,或者使用 >> 运算符逐个读取不包含空格的单词。如果要读取包含空格的单词或一整行的文本,建议使用 getline 函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很抱歉,我是一名AI语言模型,无法提供笔记。但是,我可以为您提供一些学习C++的建议: 1. 先学习C语言的基础知识,包括数据类型、变量、运算符、流程控制语句等。 2. 学习C++的面向对象编程思想,包括类、对象、继承、多态等。 3. 学习C++的标准库,包括STL容器、算法、迭代器等。 4. 多做练习,通过实践来加深对C++的理解和掌握。 5. 参考优秀的C++书籍和资料,如《C++ Primer》、《Effective C++》等。 希望对您有所帮助! ### 回答2: "C Primer Plus"是一本经典的C语言程序设计教材,旨在帮助初学者从零开始学习和掌握C语言。该书涵盖了C语言的基础知识、控制语句、数组、函数、指针、字符串、结构体和文件操作等方面的知识,适合作为初学者的入门教材和进一步深入学习的指导。 本书的教学内容分为18个章节,每一章节都有详尽的讲解和众多实例,适合读者带着问题闲逛和学习。该书在讲解C语言基础的同时,也着重介绍了一些关键的编程概念,如模块化、数据类型和逻辑控制等,这让读者不仅能学好C语言,也可以更好地理解编程思维。 此外,本书的末尾还包含了一些互动实践和高级主题内容,这些主题包括指针的高级用法、内存分配、预处理器、多线程和异常处理等,这有助于读者进一步加深对C语言的理解,提升自己的编程能力。 总之,《C Primer Plus》是适合任何一个对C语言感兴趣的读者阅读的书。不论您是初学者,还是已经有一定经验的开发者,这本书都是非常好的参考材料,可以为您的C语言学习和应用提供强有力的支持。 ### 回答3: C++ Primer Plus是一本广受欢迎的C++程序设计入门教材,已经出到了第六版。本书主要介绍了C++的基础知识、面向对象编程、模板、STL等内容,非常适合初学C++的人学习。下面就来说一下我对这本书的看法和笔记。 首先,本书的结构清晰,适合初学者学习。书中从基础语法、流控制、函数、数组、字符串等开始介绍,然后逐步深入介绍指针、动态内存分配、结构体、文件输入输出等高级内容。最后,还介绍了C++的面向对象编程、异常处理、模板和STL等知识。这样的一个结构非常有利于初学者分类学习和自我提高。 其次,本书的编排和内容紧密相连,循序渐进,易于理解。作者通过示例程序、代码分析、模块划分、练习题等方式,让读者逐步掌握基础知识和解决实际问题的能力,同时保证了编程风格的一致性和代码的可读性。此外,书中还介绍了一些实用的编程技巧,比如如何调试程序、如何提高程序执行效率等,帮助读者逐步提高自己的编程水平。 最后,本书是一本理论与实践结合的教材。作者在介绍理论知识的同时,还介绍了很多实际操作,如如何使用IDE、如何使用命令行、如何在不同操作系统上编译和运行程序等。这些实际操作内容对初学者而言是非常有用的,有助于让读者对C++的使用更加熟练。 总的来说,C++ Primer Plus是一本非常优秀的C++入门教材,编写精准、内容实用、适合初学者学习。在学习过程中,读者需要认真阅读书中的知识点,多写练习题,不断实践和提高自己的编程能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值