PythonStudy——函数的返回值 The return value of the function

# 在函数体中,通过return关键词返回函数的内部数据给外部

"""
# 一、作用
# return作用:1.结束函数;2.将函数的内部数据返回给外部
def fn():
    print(123)
    return  # return可以直接结束函数的执行,所以return之下的语句永远不会执行
    print(12345)
fn()

def func():
    num = input('num: ')
    return num  # return可以将函数的内部数据返回给外部
res = func()
print(res)

 


"""

"""
# 二、应用场景
# 1.不明确return关键词的函数:系统在函数最末尾自动添加了return,返回的是None
def fn1():
    print('普通的函数执行')

# res = fn1()  # 一般不需要对这样的函数进行接收执行结果
# print(res)
print(fn1())

"""

# 重点:函数名()
# 1)拿到函数地址 => 2)加()执行函数体 => 3)得到函数的执行结果

"""
# 2.明确空return关键词的函数:为了结束函数而return
def print_msg():
    while True:
        msg = input("msg: ")
        if msg == 'q':
            # break
            return  # 在特定的位置需要直接结束函数,但不需要告诉外界某个结果,用空return处理
        print(msg)
    print(msg)  # 在break下可以被执行,在return下不能被执行
res = print_msg()
print(res)

 


"""

# 3.有明确的返回值需求的函数:
# -- python中的函数本质上只能返回一个值,
# -- 值跟在return关键词后
# -- 可以通过语法上返回多个值,值之间用逗号隔开,但是本质上返回装有多个值的元组

# def get_num():
#     num = input('num: ')
#     return num
# print(get_num())

def get_two_num():
    n1 = input('n1: ')
    n2 = input('n2: ')
    return n1, n2
    # return (n1, n2)
# print(get_two_num())
num1, num2 = get_two_num()  # python的return支持多值返回的语法原因是python中有解压赋值
print(num1, num2)
# 注意:
# 当用一个值接收函数的返回值,一定没有问题
# -- 函数返回一个接收一个;函数返回多个,接收装有多个值得元组
# 当用多个值接收函数的返回值,采用的是解压赋值的机制,返回值的个数一定要与接收值得个数相同

转载于:https://www.cnblogs.com/tingguoguoyo/p/10764982.html

<think>我们正在处理C/C++中fseek函数返回值。fseek用于设置文件指针的位置,其原型为: int fseek(FILE *stream, long offset, int whence); 返回值处理非常重要,因为fseek可能失败(例如文件未打开、偏移无效等)。根据C标准,fseek成功时返回0,失败时返回非0值。 ### 处理fseek返回值的步骤 1. **检查返回值**:必须检查fseek的返回值以确定操作是否成功。 2. **错误处理**:如果返回非0值,应进行适当的错误处理(如打印错误信息、清理资源等)。 ### 示例代码 ```c #include <stdio.h> int main() { FILE *fp = fopen("example.txt", "rb"); if (fp == NULL) { perror("Failed to open file"); return 1; } // 尝试将文件指针移动到文件末尾 if (fseek(fp, 0, SEEK_END) != 0) { perror("fseek failed"); fclose(fp); return 1; } // 获取当前指针位置(即文件长度) long file_size = ftell(fp); if (file_size == -1) { perror("ftell failed"); fclose(fp); return 1; } printf("File size: %ld bytes\n", file_size); // 将指针移回文件开头 rewind(fp); // 相当于 fseek(fp, 0, SEEK_SET) 且不检查错误(因为rewind不返回错误) // ... 其他操作 ... fclose(fp); return 0; } ``` ### 关键点说明 - **返回值检查**:每次调用fseek后都应检查其返回值是否为0。非0值表示失败。 - **错误信息**:使用`perror`可以输出与当前errno相关的错误描述。 - **资源清理**:如果fseek失败,通常需要关闭文件并退出程序(或进行错误恢复)。 - **rewind函数**:rewind(fp)等同于`(void) fseek(fp, 0, SEEK_SET)`,它不提供错误返回。如果必须确保指针回到开头,应使用fseek并检查返回值。 ### 错误处理进阶 在大型程序中,可能需要更详细的错误处理: ```c int seek_to_end(FILE *fp) { if (fseek(fp, 0, SEEK_END) != 0) { // 可以记录日志、设置错误码等 return -1; } return 0; } // 使用示例 if (seek_to_end(fp) != 0) { // 处理错误 } ``` ### 注意事项 1. **大文件支持**:对于大于2GB的文件,应使用`fseeko`(在POSIX系统中)或`_fseeki64`(在Windows中)代替fseek,因为fseek的offset是long类型,可能不足以表示大文件的偏移。 2. **文本文件和二进制文件**:在文本文件中,fseek的偏移量可能受换行符转换影响(尽管偏移量通常由ftell获得,因此是内部表示的位置)。在二进制文件中则没有这个问题。 ### 引用说明 根据用户提供的引用[2]: - `fseek`的第三个参数可以是`SEEK_SET`(文件开头)、`SEEK_CUR`(当前位置)、`SEEK_END`(文件末尾)。 - 使用`fseek`和`ftell`可以获取文件长度:先将指针移到末尾,再用`ftell`获取位置。 ### 相关问题 1. 如何安全地移动大文件(超过2GB)的文件指针? 2. `ftell`函数在失败时返回什么?如何正确处理? 3. 在文本文件和二进制文件中使用`fseek`有何不同? 4. 为什么`rewind`函数不返回错误?它是否安全?</think>### 如何处理 C/C++ 中 `fseek` 函数返回值 `fseek` 函数返回值处理至关重要,因为它指示文件指针操作是否成功。以下是详细的处理方法和最佳实践: #### 1. **理解返回值含义** ```c int fseek(FILE *stream, long offset, int whence); ``` - **成功**:返回 `0` - **失败**:返回**非零值**(通常是 `-1`) - 常见失败原因: - 文件未打开或无效文件指针 - 偏移量超出文件范围 - 文件以只读方式打开却尝试写入 - 设备错误(如磁盘空间不足) #### 2. **标准错误处理模式** ```c FILE *fp = fopen("data.bin", "rb"); if (fp == NULL) { perror("文件打开失败"); return EXIT_FAILURE; } // 将指针移动到文件末尾 if (fseek(fp, 0, SEEK_END) != 0) { // 必须检查返回值! perror("fseek 失败"); fclose(fp); return EXIT_FAILURE; } // 获取文件长度 long file_size = ftell(fp); if (file_size == -1) { // ftell 也需要错误检查 perror("ftell 失败"); fclose(fp); return EXIT_FAILURE; } // 其他操作... fclose(fp); ``` #### 3. **关键注意事项** - **二进制文件 vs 文本文件**: ```c // 二进制文件(精确偏移) fseek(fp, 100, SEEK_SET); // 移动到第100字节处 // 文本文件(受换行符转换影响) fseek(fp, 0, SEEK_END); // 移动到文件末尾,但偏移量可能不精确 ``` 文本模式中换行符转换可能导致偏移计算不准确[^2]。 - **大文件支持**(>2GB): ```c #ifdef __WIN32__ _fseeki64(fp, 4294967296, SEEK_SET); // Windows 64位偏移 #else fseeko(fp, 4294967296, SEEK_SET); // POSIX 64位偏移 #endif ``` #### 4. **错误处理进阶技巧** - **获取具体错误信息**: ```c if (fseek(fp, offset, SEEK_SET) != 0) { fprintf(stderr, "错误代码: %d\n", ferror(fp)); perror("详细错误"); } ``` - **错误恢复**: ```c if (fseek(fp, 0, SEEK_CUR) != 0) { // 验证当前位置 clearerr(fp); // 清除错误标志 rewind(fp); // 重置到文件开头 } ``` #### 5. **相关函数返回值处理** | 函数 | 成功返回值 | 失败返回值 | 检查方式 | |-------------|------------------|------------|------------------------| | `ftell()` | 当前偏移位置 | `-1L` | `if(ftell(fp) == -1)` | | `rewind()` | 无返回值 | 无 | 无需检查(隐含操作) | | `fgetpos()` | `0` | 非零 | `if(fgetpos(fp, &pos))`| #### 典型应用:获取文件长度 ```c long get_file_size(FILE *fp) { long original = ftell(fp); // 保存原位置 if (original == -1) return -1; if (fseek(fp, 0, SEEK_END) != 0) return -1; // 移到末尾 long size = ftell(fp); // 获取大小 fseek(fp, original, SEEK_SET); // 恢复原位置 return size; } ``` > **重要提示**:始终在调用 `fseek` 后检查返回值,未处理的定位错误可能导致后续文件操作完全失败或数据损坏。 ### 相关问题 1. 如何安全地在超过 4GB 的大文件上使用文件定位函数? 2. `fseek` 和 `lseek` 在底层实现上有何区别? 3. 文本文件和二进制文件的文件位置指示器有何不同? 4. 当文件被其他进程修改时,`fseek` 的行为会如何变化? 5. 如何在不使用 `fseek` 的情况下实现随机文件访问?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值