文件操作详解(C语言)

news2024/10/6 8:30:01

1.为什么要用到文件?怎样数据才能持久化?

保存在内存中的数不安全(一次断电,忘记保存,不用了还给系统)

持久化:保存在硬盘上(放在文件中)

什么是文件?文件分为程序文件数据文件

程序文件是什么呢?

在windows环境下。.c源程序文件 / .obj目标文件 / .exe执行文件,这些就是程序文件

数据文件

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

如图:

编辑.c源程序文件(test.c)可以对A文件(数据文件)进行读写操作进行

2.文件名

一个文件有唯一的文件标识,以便于用户的识别和引用

文件名包含三部分:文件路径 + 文件主干名 + 文件后缀

例:  c:\code\heyerous\test.txt

3.文件的打开 or 关闭

->1. 文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称:文件指针

每个被使用的文件都在内存中开辟了一个相应的文件信息区用来存放文件的相关信息(如:文件的名字,文件的状态,文件当前的位置等)。这些信息是保存在一个结构体变量中的,该结构体类型是由系统声明的,取名:FILE

如图:

注:  每打开一个文件就会产生一个文件信息区,每一个文件信息区都需要一个文件指针来指向它。不同的C编译器的FILE类型包含的内容不完全相同,但大同小异

一般都是通过FILE的指针来维护这个FILE结构的变量,这样更方便

创建一个FILE指针的变量:

FILE* pf       //文件指针变量

->2. 文件的打开和关闭

文件在读写之前打开文件,在使用结束之后应该关闭文件

ANSIC(标准C)规定使用fopen函数(打开成功放回文件地址,失败则返回NULL)来打开文件,fclose函数(打开成功返回0,打开失败返回EOF(-1))来关闭文件

fopen和fclose的使用示例:

#include <stdio.h>

int main()
{
    //打开文件
    FILE* pf = fopen("C:\\code\\heyerous\\test.txt", "r");
    //判断文件是否打开成功
    if(pf == NULL)
    {
       perror("fopen");
       return 1;
    }
    //读写文件
    //....
    //关闭文件
    fclose(pf);
    pf = NULL;
}

运行结果:

打开成功说明该路径存在这个文件

上面所示代码是用的绝对路径打开的文件 C:\code\heyerous\test.txt

绝对路径

文件的准确位置

相对路径

相对路径的理解,可以认为是程序和文件的相对位置,比如说和当前.c文件在同文件夹中,或者文件在.c文件的上级路径中 (以.c文件为例)

就可以看到该文本文件(test.txt)了

将文件放在上级目录程序依旧可以运行

除了这两个操作以外还其他的操作:

如:“../test.txt”  上级目录   “./text.txt”  当前目录  "././test,txt" 上一级目录的上一级目录

注:  创建文件的时候看看后缀名(扩展名)

4.怎么读写?

1.文件的顺序读写

fputc

->1.  fputc函数    //向文件中写一个字符

int fputc(int charactor, FILE* stream);

(1). FILE* stream 需要写入的文件的指针

(2). int charactor 需要向文件中写的字符

->2.  fputc函数的使用

puts按顺序向文件中写内容

#include <stdio.h>

int main()
{
	//用"w"会将我们上次写入的内容全部覆盖掉
	FILE* pf = fopen("C:\\code\\heyerous\\test.txt", "w"); 
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
    //方法1
	/*fputc('z', pf);
	fputc('y', pf);
	fputc('x', pf);
	fputc('6', pf);*/
    //方法2:使用for循环
	for (char ch = 'A'; ch <= 'Z'; ch++)
	{
		fputc(ch, pf);
	}
	fclose(pf);
	pf = NULL;
	return 0;
}

运行结果:

向文件写一个字符,不是字符串!!!

fgetc

->1. fgetc函数    //向文件中读一个字符

int fgetc(FILE* stream);

(1). 按顺序向文件读字符

(2). FILE* stream   需要读文件的指针

->2. fgetc函数的使用

#include <stdio.h>

int main()
{
	FILE* pf = fopen("C:\\code\\heyerous\\test.txt", "r"); 
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}
	int ch = fgetc(pf);
	printf("%c", ch);
	ch = fgetc(pf);
	printf("%c", ch);
	ch = fgetc(pf);
	printf("%c", ch);
	fclose(pf);
	pf = NULL;
	return 0;
}

运行结果:

fputs

->1. fputs函数   //向文件中写入一行内容

int fputs( const char *string, FILE *stream );

(1). const char *string  需要写入文件的内容

(2). FILE *stream 目标文件

->2. fputs函数的使用  

这里我们换用相对路径

#include <stdio.h>

int main()
{
    FILE* pf = fopen("test.txt", "w");
    if(NULL == pf)
    {
       perror("fopen");
       return 1;
    }
    fputs("hello world", pf);
    fclose(pf);
    pf ==NULL;
    return 0;
}

运行结果:

fgets

->1. fgets函数 //向文件读一行内容

char *fgets( char *string, int n, FILE *stream );

(1). char *string  将读到的内容放到另一个空间中

(2). int n  个数限制

(3). FILE *stream 需要读的文件的指针

->2. fgets函数的使用

#include <stdio.h>
int main()
{
    FILE* pf = fopen("test.txt", "r");
    if (NULL == pf)
    {
        perror("fopen");
        return 1;
    }
    char buf[25] = { 0 };
    fgets(buf, 12, pf);
    printf(buf);
    fclose(pf);
    pf = NULL;
    return 0;
}

运行结果:

注:  fgets读文件时会留一个空间存放\0,所以我们想要将hello world全部都读出来得限制12个个数(包括\0)

如果buf空间比文件中一行大,即:fgets只读一行的内容

1.buf > num, 直接读到末尾结束,第二行不管,只管第一行得内容

2.buf < num,只读num数量的字符

fprintf

->1. fprintf函数   //将格式化的内容写到文件中  

int fprintf(FILE* stream, const char*format, ...);

(1). FILE* stream  需要写入的文件的指针

(2). const char*format  数据流:格式化字符串等各种信息

(3). ...  可变参数列表可接收多个参数

->2. fprintf函数的使用

#include <stdio.h>

typedef struct S
{
    char name[20];
    int age;
    float score;
}S;

int main()
{
    FILE* pf = fopen("test.txt", "w");
    if(FILE == NULL)
    {
       perror("fopen");
       reutrn 1;
    }
    s stu = {"zhangsan", 20, 89.5}; 
    fprintf(pf, "%s %d %f", stu.name, stu.age, stu.score);
    fclose(pf);
    pf = NULL;
    return 0;
}

运行结果:

 fscanf

->1. fscanf函数   //将格式化的内容写到文件中  

int fscanf(FILE* stream, const char*format, ...);

(1). FILE* stream  需要写入的文件的指针

(2). const char*format  数据流:格式化字符串等各种信息

(3). ...  可变参数列表可接收多个参数

->2. fprintf函数的使用

#include <stdio.h>

typedef struct S
{
    char name[20];
    int age;
    float score;
}S;

int main()
{
    FILE* pf = fopen("test.txt", "r");
    if (pf == NULL)
    {
        perror("fopen");
        return 1;
    }
    S stu = { 0 };
    fscanf(pf, "%s %d %f", stu.name, &(stu.age), &(stu.score));
    printf("%s %d %f", stu.name, stu.age, stu.score);
    fclose(pf);
    pf = NULL;
    return 0;
}

运行结果:


以上函数操作时写入文件都看得懂,因为是文本信息(适用于所有输入输出流)

我们将数据传给输出设备如果这些设备的读写的都不相同,程序要使用的话都需要了解,那对一个程序来说太复杂了,所以为了解决这个问题C语言引入了流(stream)

将数据输出到流上,然后通过流输出到设备上

任何一个C语言程序运行的时候:默认打开3个流

1.stdin - 标准输出(键盘)

2.stdout - 标准输出(屏幕)

3.stderr - 标准错误(屏幕)

这三个流的类型都是FILE*

例1:

int ch = fgets(stdin)
fputc(ch, stdout)

从键盘上读一个字符然后写到屏幕上

例2:

#include <stdio.h>

typedef struct stu
{
    char name[20];
    int age;
    float score;
}stu;

int main()
{
    stu p = { 0 };
    fscanf(stdin, "%s %d %f", p.name, &(p.age), &(p.score));
    fprintf(stdout, "%s %d %f", p.name, p.age, p.score);
    return 0;
}

运行结果:

fwrite

->1. fwrite函数  //以二进制的方式向文件中写入

size_t fwrite(const void *ptr, size_t size, size_t count, FILE* stream)

(1). const void *ptr  需要写入数据的地址

(2). size_t size   每个元素的大小

(3). size_t count   需要写入文件的元素个数

(4). FILE *stream   该文件的指针

->2. fwrite函数的使用

#include <stdio.h>

typedef struct stu
{
    char name[20];
    int age;
    float score;
}stu;

int main()
{
    FILE *pf = fopen("test.txt", "wb"); //wb以二进制的方式写
    if(NULL ==pf)
    {
       perror("fopen");
       return 1;
    }
    stu p = {"zhangsan", 20, 85.5};
    fwrite(&p, sizeof(stu), 1, pf);
    fclose(pf);
    pf = NULL;
    return 0;    
}

运行结果:

从运行结果来看,确实是以二进制的形式写进去的

 fread

->1. fread函数  //以二进制的方式读文件

size_t fwrite(void *ptr, size_t size, size_t count, FILE* stream)

(1). void *ptr  存放向文件读到的数据

(2). size_t size   每个元素的大小

(3). size_t count   需要写入文件的元素个数

(4). FILE *stream   该文件的指针

->2. fread函数的使用

#include <stdio.h>

typedef struct stu
{
    char name[20];
    int age;
    float score;
}stu;

int main()
{
    FILE *pf = fopen("test.txt", "rb"); //以二进制的形式读
    if(NULL == pf)
    {
       perror("fopen");
       return 1;
    }
    stu s = { 0 };
    fread(&s, sizeof(stu), 1, pf);
    fclose(pf);
    pf = NULL;
    return 0;
}

运行结果:

可以看到fread将文件的内容放入了结构体变量s上

sprintf

->1. sprintf函数  //把格式化的数据,以字符串的格式打印存放在一个字符串中

int sprintf(const char* s, const char* format, ...);

(1). const char* s  存放数据的地址

(2). const* format   数据流:格式化字符串等各种信息

(3). ...   可变参数列表,可以放多个参数

->2. sprintf函数的使用

#incldue <stdio.h>

typedef struct tmp
{
	char name[20];
	int age;
	float score;
}tmp;

int main()
{
	tmp s = {"zhangsan", 20, 86.5};
	char buf[30] = { 0 };
	sprintf(buf, "%s%d%f", s.name, s.age, s.score);
	printf(buf);
	return 0;
}

运行结果:

 sscanf

->1. sscanf函数  //从一个字符串中,还原出一个格式化的数据

int sscanf(const char* s, const char* format, ...);

(1). const char* s  存放数据的地址

(2). const* format   数据流:格式化字符串等各种信息

(3). ...   可变参数列表,可以放多个参数

->2. sscanf函数的使用

#include <stdio.h>

typedef struct tmp
{
	char name[20];
	int age;
	float score;
}tmp;

int main()
{
	tmp s = { 0 };
	char buf[30] = { "zhangsan 20 86.5" };
	sscanf(buf, "%s%d%f", s.name, &(s.age), &(s.score));
	printf("%s %d %f", s.name, s.age, s.score);
	return 0;
}

运行结果:


scanf - 从键盘(stdin)上读取格式化的数据

printf - 把数据输出到屏幕(stdout)上

fprintf - 针对所有输入流的格式化的输入函数:stdin,打开的文件

fscanf - 针对所有的输出流的格式化的输出函数:stdout,打开的文件

5.文件的随机读写

fseek

->1. fseek函数  //调整光标位置

int fseek(FILE* stream, long int offset, int orgin);

(1). FILE* stream  目标文件

(2). long int offset   偏移量(往哪偏移)

(3). int orgin  从哪开始调整

​​​SEEK_SET    文件开始的位置

SEEK_CUR   光标现指向的位置

SEEK_END   文件末尾位置

->2. fseek函数的使用

 例:

文本文件中的内容

#include <stdio.h>
 
int main()
{
    FILE* pf = fopen("test.txt", "r");
    if (NULL == pf)
    {
        perror("fopen");
        return 1;
    }
    int ch = fgetc(pf);
    ch = fgetc(pf);
    printf("%c\n", ch);
    ch = fgetc(pf);
    //此时光标在字符c的后面d的前面,如果继续往下读肯定回到d,但是我们调整一下去读b
    fseek(pf, 1, SEEK_SET);// 或者fseek(pf, -2, SEEK_SUR);
    //这时往下读就会读到b
    ch = fgetc(pf);
    printf("%c", ch);
    fclose(pf);
    pf = NULL;
    return 0;
}

运行结果:

ftell

->1. ftell函数  //返回文件指针相对于起始位置的偏移量

long int fseek(FILE* stream);

(1). FILE* stream  目标文件

#include <stdio.h>

int main()
{
    FILE* pf = fopen("test.txt", "r");
    if (NULL == pf)
    {
        perror("fopen");
        return 1;
    }
    int ch = fgetc(pf);
    printf("%c\n", ch);
    ch = fgetc(pf);
    printf("%c\n", ch);
    int pos = ftell(pf);
    printf("%d", pos);
    fclose(pf);
    pf = NULL;
    return 0;
}

运行结果:

->2. rewind函数的使用

#include <stdio.h>

int main()
{
    FILE *pf = fopen("test.txt", "r");
    if(NULL == pf)
    {
       perror("fopen");
       return 1;
    }
    int ch = fgetc(pf);
    printf("%c\n", ch);
    rewind(pf);
    ch = fgetc(pf);
    printf("%c", ch);
    fclose(pf);
    pf = NULL;
    return 0;
}

rewind

->1. rewind函数  //使指针回到初始位置

void rewind( FILE *stream );

(1). FILE *stream  需要调整文件的指针

->2. rewind函数的使用

#include <stdio.h>

int main()
{
    FILE *pf = fopen("test.txt", "r");
    if(NULL == pf)
    {
       perror("fopen");
       return 1;
    }
    int ch = fgetc(pf);
    printf("%c\n", ch);
    rewind(pf);
    ch = fgetc(pf);
    printf("%c", ch);
    fclose(pf);
    pf = NULL;
    return 0;
}

运行结果:

6.文本文件和二进制文件

数据文件被称为文本文件或者二进制文件

数据在内存中以二进制的形式存储,如果不加转换的输出到外存(文件),就是二进制文件

在外存上以ASCII码的形式储存,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件

测试代码:

#include <stdio.h>

int main()
{
    FILE* pf = fopen("test.txt", "wb");
    if (NULL == pf)
    {
        perror("fopen");
        return 1;
    }
    int a = 10000;
    fwrite(&a, 4, 1, pf);
    fclose(pf);
    pf = NULL;
    return 0;
}

运行结果:

可以看到是二进制文件

我们来看看它是否是如我们所说的二进制一样

 

然后添加这个文件

添加进来之后右击点击这个文件,选择打开方式,点击二进制编辑器

可以看到是以十六进制的方式写的,因为这样更加方便表达展现,而且字节存储方式是小端

#include <stdio.h>

int main()
{
    FILE* pf = fopen("test.txt", "w");
    if (NULL == pf)
    {
        perror("fopen");
        return 1;
    }
    int a = 10000;
    fprintf(pf, "%d", a);
    fclose(pf);
    pf = NULL;
    return 0;
}

运行结果:

文本文件

7.文件读取结束的判定

feof 和 ferror

int ferror( FILE *stream );
int feof( FILE *stream );

(1). FILE *stream - 需要判断的文件

feof - 文件正常读取遇到了结束标志而结束就返回真

ferror - 返回真,说明文件在读取过程中出错了而结束

用这两个函数的前提是文件已经读取结束了才可以去使用这两个函数

用于文件读取结束的时候,判断是读取失败,还是到文件末尾结束 

1.文本文件读取是否结束,判断返回值是否为EOF(fgetc),NULL(fgets)

例如:

  • fgetc判断是否为EOF
  • fgets判断是否为NULL

文本文件的例子:

#include <stdio.h>
#define EXIT_FAILURE 1

int main()
{
    FILE *pf = fopen("test,txt", "r");
    if(NULL == pf)
    {
       perror("file opening failed");
       return EXIT_FAILURE;
    }
    int ch;
    while((ch = fgetc(pf)) != EOF)  //fgetc的返回值是int类型
    {
          putchar(ch);
    }
    //判断是什么原因结束的
    //判断文件是否是读取时遇到错误结束
    if(ferror(pf))
       puts("I/O error when reading"); //I/O读取文件
    else if(feof(pf))
       puts("End of file reached successfully");
    fclose(pf);
    pf = NULL;
    return 0;
}

2.二进制文件的读取结束判断,判断返回值是否小于实际要读的个数

例如:

  • fread 判断返回值是否小于实际要读的个数

二进制文件的例子:

#include <stdio.h>

enum     //没有枚举名作用和define差不多,文本替换
{
  size = 5,  
};

int main()
{
    FILE* pf = fopen("test.txt", "wb");
    if (NULL == pf)
    {
        perror("FILE fopening failed");
        return 1;
    }
    int a[size] = { 1, 2, 3, 4, 5, };
    fwrite(a, sizeof * a, size, pf);
    fclose(pf);
    pf = NULL;
    return 0;
}
//以上代码是将数组a中的容写进文件test.txt

#include <stdio.h>

enum     //没有枚举名作用和define差不多,文本替换
{
  size = 5,  
};

int main()
{
    FILE* pf = fopen("test.txt", "rb");
    int a[size] = { 0 };
    size_t ret_code = fread(a, sizeof *a, size, pf);
    if (ret_code == size)
    {
        perror("FILE fopening failed");
        return 1;
    }
    else if(feof(pf))
    {
            puts("Error reading test.txt: unexpected end of file\n");
    }
    else if(ferror(pf))
    {
            puts("Error reading test.txt");
    }
    fclose(pf);
    pf = NULL;
    return 0;
}

8.文件缓冲区

我们将数据冲数据区输出/输入到磁盘(文件)的时候不是直接输入/输出过去而是先经过缓冲区,通过缓冲区进入磁盘的,但是我们放到缓冲区的数据不会直接进入到磁盘,要怎么才能将数据放到磁盘了

将数据放入磁盘的条件

(1). 缓冲区放满的时候,缓冲区会自动将数据放入磁盘

(2). 主动刷新缓冲区的时候,缓冲区会将数放入磁盘

(3). 使用fclose关闭文件时,也会主动刷新缓冲区的将数据写到硬盘中然后关闭文件

 注:

因为有缓冲区的存在,C语言在操作文件的时候。需要做刷新缓冲区或者在文件操作结束的时候关闭文件   很重要!!!(保存信息)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1885584.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鱼塘专用激光冲击波声压网驱鸟器

随着生态环境的日益改善&#xff0c;越来越多的鸟类频繁光临鱼塘&#xff0c;捕食鱼苗或成鱼&#xff0c;给养殖户造成巨大的经济损失。 如何有效地让鸟远离你的鱼塘呢&#xff1f; 鱼塘专用激光冲击波声压网驱鸟器&#xff0c;结合了多种驱鸟功能&#xff0c;包括激光驱鸟技术…

分页导航DOM更新实践:JavaScript与jQuery的结合使用

分页导航DOM更新实践&#xff1a;JavaScript与jQuery的结合使用 在Web开发中&#xff0c;分页导航是展示大量数据时不可或缺的UI组件。合理的分页不仅可以提高应用性能&#xff0c;还能优化用户体验。本博客将通过一个实际的DOM结构和模拟数据&#xff0c;讲解如何使用JavaScr…

CentOS修复OpenSSH漏洞升级到openssh 9.7 RPM更新包

在做政府和学校单位网站时&#xff0c;经常需要服务器扫描检测&#xff0c;经常被OpenSSH Server远程代码执行漏洞&#xff08;CVE-2024-6387&#xff09;安全风险通告&#xff0c;出了报告需要升级OpenSSH。 使用yum update openssh是无法更新到最新的&#xff0c;因为系统里的…

基于蜉蝣优化的聚类算法(MATLAB)

优化问题广泛存在于人们的日常生活和工程领域&#xff0c;其解决如何寻找使目标值达到最优的可行解的问题。伴随着科技发展&#xff0c;优化问题在生产调度、神经网络训练、图像处理、能源系统等领域起到举足轻重的作用&#xff0c;有助于提高系统效率。优化问题依据不同标准可…

Vision Transformer论文阅读笔记

目录 An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale -- Vision Transformer摘要Introduction—简介RELATED WORK—相关工作METHOD—方法VISION TRANSFORMER (VIT)—视觉Transformer(ViT) 分析与评估PRE-TRAINING DATA REQUIREMENTS—预训练数据…

基于小波分析的纹理和颜色反射对称性检测(MATLAB R2018A)

对称物体在自然图像和合成图像中普遍存在。作为对称物体最重要的全局特征之一&#xff0c;对称性检测长期以来都是计算机视觉领域的研究热点&#xff0c;并在图片的语义提取、图像语义理解以及情感识别等任务上具有广泛的应用。对称物体的检测技术&#xff0c;就是将图片中所蕴…

大淘客api实现多多进宝的商品查询PHP版

大家好&#xff0c;我是网创有方&#xff0c;今天教大家如何使用大淘客的api实现拼多多商品详情信息查询。这里用到的多多进宝&#xff0c;如果没有多多进宝的&#xff0c;先去多多进宝注册个账号吧&#xff01; 第一步&#xff1a;进入大淘客官方创建应用&#xff0c;并且下载…

易编橙·终身成长社群:帮助编程小伙伴少走弯路

&#x1f34a; 目录 &#x1f34a; 自我介绍 &#x1f34a; 如何加入&#xff1f; &#x1f34a; 【擅长的技术】 &#x1f34a; 星主介绍 &#x1f34a; 星球天团 &#x1f34a; 易编橙终身成长社群介绍及权益&#xff5e; &#x1f34a; 受众群体 &#x1f34a; 如何…

ERP系统中有哪些模块?有哪些具体实现方案呢?

对于许多初次接触ERP系统的企业来说&#xff0c;可能会对系统中包含的模块和功能感到困惑。本文将详细介绍ERP系统中的主要模块&#xff0c;需要明确的是&#xff0c;ERP系统是一个庞大的系统&#xff0c;包含了多个模块&#xff0c;每个模块都有其独特的功能和作用。这些模块涵…

CCAA:认证通用基础 10(审核的概念、审核有关的术语、审核的特征、审核原则)

10.审核的概念、审核有关的术语、审核的特征、审核原则 10.1审核的基本概念 第一章 审核基础知识 第一节 概述 1.什么是审核 审核是认证过程中最基本的活动&#xff0c;是审核方案的重要组成部分&#xff0c;其实施效果直接影响到审核方案的意图和审核目标的达成。 在认证…

新手教学系列——【Python开发】不同系统更换pip源的方法

在使用Python进行开发时,你可能会发现使用pip安装包的速度较慢,尤其是在国内进行操作时。为了提高安装速度,我们可以将pip的默认源更换为国内的一些镜像源。本文将详细介绍如何在不同操作系统上进行这一操作,并给出常用的国内镜像源。 为什么要换源 pip默认使用的是官方的…

Python入门 2024/7/1

目录 第一个程序hello world 数据类型 注释 变量 用type类型查看数据类型 ​编辑 数据类型转换 ​编辑 标识符 运算符 字符串的三种定义方式 字符串拼接 ​编辑​编辑 字符串格式化 第一个程序hello world 区分c和python c是printf python是print print("h…

QT Creator生成uml类图

先说方法&#xff0c;使用Doxygen工具&#xff0c;笔者用的虚拟机linux系统下的qt5.7&#xff0c;没找到自带的uml生成类的工具。 1、Doxygen 安装 在 Ubuntu 系统中&#xff0c;执行下面命令安装 doxygen 和 graphviz 软件包。 sudo apt install graphviz # 用于生成代码…

汇凯金业:投资交易如何才能不亏损

投资交易中永不亏损是一个理想化的目标&#xff0c;现实中无法完全避免亏损。然而&#xff0c;通过科学的方法、合理的策略和严格的风险管理&#xff0c;投资者可以大幅减少亏损&#xff0c;并提高长期盈利的概率。以下是一些关键策略和方法&#xff0c;帮助投资者在交易中尽量…

国内品牌成功入驻美国线下商超的五大要诀

海外市场拥有巨大资源&#xff0c;许多国内品牌寻求海外市场拓展&#xff0c;美国市场尤为吸引。但入驻美国线下商超非易事&#xff0c;需明确目标定位、周密策略及强大执行力。下面探讨入驻技巧。 一、明确目标与定位 进入美国市场前&#xff0c;品牌方需明确目标&#xff1a…

【C语言】常见的字符串函数

©作者:末央&#xff06; ©系列:C语言初阶(适合小白入门) ©说明:以凡人之笔墨&#xff0c;书写未来之大梦 目录 strlen函数模拟实现 strstr子串查找函数模拟实现 strtok字符串分割 strlen函数 strlen函数是一个用于求字符串长度的库函数。它的参数是被求长度的字…

React+TS前台项目实战(二十三)-- 基于属性自定义数值显示组件Decimal封装

文章目录 前言Decimal组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天要封装的Decimal 组件&#xff0c;是通过传入的属性进行定制化显示数值&#xff0c;在渲染时&#xff0c;会根据不同的情况显示整数部分、小数部分和单位&#xff0c;支持自定义样式…

加速度数据 - 初始速度未知对速度积分的影响

这个问题不多说&#xff0c;只看一下速度积分的结果就可以知晓&#xff1a; 原本三角函数sin的积分是相移之后的自身&#xff0c;但是&#xff1a; 注意这一个概念&#xff1a; 原始信号如果引入一个未知的直流偏移。对该信号进行积分的结果&#xff0c;会将这个直流偏置转换…

Emacs之解决:java-mode占用C-c C-c问题(一百四十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

晨持绪科技:抖音网店现在能做起来吗

在这个信息爆炸的时代&#xff0c;抖音以其独特的魅力和庞大的用户基数&#xff0c;成为了众多创业者心中的黄金地带。然而&#xff0c;许多人在跃跃欲试的同时&#xff0c;也不禁会问&#xff1a;抖音网店现在还能做起来吗? 我们要认识到&#xff0c;抖音作为一个短视频平台&…