Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
文本文件编辑C_C_File_Edit - Fatal编程技术网

文本文件编辑C

文本文件编辑C,c,file,edit,C,File,Edit,我有一个程序,它接受用户提供的数据(int、float和string)并将其写入文本文件。现在我必须更新部分写入的数据 例如: 在文件的第4行,我想更改前两个单词(有一个int和一个float)。我该怎么做 根据我发现的信息,fseek()和fputs()可以使用,但我不知道如何准确地到达特定行 (由于我是C语言的初学者,对解释过的代码将不胜感激)您确实需要阅读所有文件,忽略不需要的内容 fseek不是很有用:它将文件定位在某个字节偏移量(相对于文件的开始或结束)处,不知道行边界 实际上,文件中

我有一个程序,它接受用户提供的数据(int、float和string)并将其写入文本文件。现在我必须更新部分写入的数据

例如:

在文件的第4行,我想更改前两个单词(有一个
int
和一个
float
)。我该怎么做

根据我发现的信息,
fseek()
fputs()
可以使用,但我不知道如何准确地到达特定行


(由于我是C语言的初学者,对解释过的代码将不胜感激)

您确实需要阅读所有文件,忽略不需要的内容

fseek
不是很有用:它将文件定位在某个字节偏移量(相对于文件的开始或结束)处,不知道行边界

实际上,文件中的行是一个定义不清的概念。行通常是以换行符(
'\n'
)结尾的字节序列(不同于换行符)。某些操作系统(Windows、MacOSX)以特殊的方式读取文本文件(例如,真实文件包含
\r\n
以结束每一行,但C库会让您产生一种错觉,以为您已经读取了
\n

实际上,您可能希望使用
getline
(或者
fgets

如果您使用
getline
,您应该注意
释放
-ing行缓冲区

如果文本文件具有非常规则的结构,则可以
fscanf
数据(忽略需要跳过的内容),而不必考虑行边界

如果您想绝对使用
fseek
(这是一个错误),则必须读取文件两次:第一次读取以记住每行的开始(或结束)位置,第二次读取以
fseek
为开始的行。但是,对于更新来说,这是不起作用的,因为您不能在文件中间插入字节。 实际上,最昂贵的操作是实际的磁盘读取。缓冲(部分由内核和
函数完成,部分由您在处理行时完成)可以忽略不计

当然,您不能在位更改文件中的某些行。如果需要这样做,请处理输入文件,生成一些输出文件(包含修改后的输入),并在完成后重命名该文件


顺便说一句,你可能对索引文件感兴趣,比如等等。。。甚至在数据库中,例如。。。。您可能会对标准的文本序列化格式感兴趣,如or(两者都有许多库,甚至对于C来说,都有很多库来处理它们)。

您确实需要读取所有文件,忽略不需要的内容

fseek
不是很有用:它将文件定位在某个字节偏移量(相对于文件的开始或结束)处,不知道行边界

实际上,文件中的行是一个定义不清的概念。行通常是以换行符(
'\n'
)结尾的字节序列(不同于换行符)。某些操作系统(Windows、MacOSX)以特殊的方式读取文本文件(例如,真实文件包含
\r\n
以结束每一行,但C库会让您产生一种错觉,以为您已经读取了
\n

实际上,您可能希望使用
getline
(或者
fgets

如果您使用
getline
,您应该注意
释放
-ing行缓冲区

如果文本文件具有非常规则的结构,则可以
fscanf
数据(忽略需要跳过的内容),而不必考虑行边界

如果您想绝对使用
fseek
(这是一个错误),则必须读取文件两次:第一次读取以记住每行的开始(或结束)位置,第二次读取以
fseek
为开始的行。但是,对于更新来说,这是不起作用的,因为您不能在文件中间插入字节。 实际上,最昂贵的操作是实际的磁盘读取。缓冲(部分由内核和
函数完成,部分由您在处理行时完成)可以忽略不计

当然,您不能在位更改文件中的某些行。如果需要这样做,请处理输入文件,生成一些输出文件(包含修改后的输入),并在完成后重命名该文件

顺便说一句,你可能对索引文件感兴趣,比如等等。。。甚至在数据库中,例如。。。。您可能会对标准的文本序列化格式感兴趣,比如or(两者都有许多库,甚至对于C来说,都可以处理它们)。

您不能在文件中“插入”字符。您必须创建程序,该程序将读取整个文件,然后在插入到新文件、您的版本、文件的其余部分之前复制部分。

您不能在文件中“插入”字符。您必须创建一个程序,该程序将读取整个文件,然后在插入到新文件之前复制部分,即您的版本,文件的其余部分。

fseek()
用于每个数据记录大小相同的随机访问文件。通常,数据是二进制的,而不是文本

为了解决您的特定问题,您需要一次阅读一行,以找到您要更改的行。进行更改的一个简单解决方案是将这些行写入临时文件,将更改写入同一临时文件,然后跳过原始文件中要更改的部分,并将重置复制到临时文件。最后,关闭原始文件,将临时文件复制到其中,然后删除临时文件

话虽如此,我建议您进一步了解随机访问文件。当存储所有大小相同的记录时,这些功能非常有用。如果您可以控制创建原始文件,这些文件可能更适合您当前的用途。

fseek()
用于每个数据记录大小相同的随机访问文件。通常,数据是二进制的,而不是文本

要解决您的特定问题,您需要阅读一行a