- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
int main()
{
FILE *ft;
char ch;
ft=fopen("abc.txt","r+");
if(ft==NULL)
{
printf("can not open target file\n");
exit(1);
}
while(1)
{
ch=fgetc(ft);
if(ch==EOF)
{
printf("done");
break;
}
if(ch=='i')
{
fputc('a',ft);
}
}
fclose(ft);
return 0;
}
正如人们所看到的,我想编辑 abc.txt
,将其中的 i
替换为 a
。< br/>该程序工作正常,但当我从外部打开 abc.txt
时,它似乎未经编辑。
有什么可能的原因吗?
为什么在这种情况下,i
之后的字符没有被 a
替换,正如答案所示?
最佳答案
存在多个问题:
fgetc()
返回 int
,不是char
;它必须返回每个有效的 char
值加上一个单独的值 EOF。正如所写,您无法可靠地检测 EOF。如果char
是无符号类型,你永远找不到EOF;如果char
是有符号类型,您可能会将某些有效字符(通常是 ÿ、y 元音变音、U+00FF、带有分音符的拉丁小写字母 Y)误识别为 EOF。
如果在以更新模式打开的文件上切换输入和输出,则必须在读取和写入之间使用文件定位操作( fseek()
、 rewind()
,名义上 fsetpos()
);并且必须使用定位操作或 fflush()
介于写作和阅读之间。
关闭您打开的内容是个好主意(现已在代码中修复)。
如果您的写入有效,您将覆盖 i
之后的字符。与 a
.
这些变化导致:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *ft;
char const *name = "abc.txt";
int ch;
ft = fopen(name, "r+");
if (ft == NULL)
{
fprintf(stderr, "cannot open target file %s\n", name);
exit(1);
}
while ((ch = fgetc(ft)) != EOF)
{
if (ch == 'i')
{
fseek(ft, -1, SEEK_CUR);
fputc('a',ft);
fseek(ft, 0, SEEK_CUR);
}
}
fclose(ft);
return 0;
}
还有更多错误检查的空间。
fseek(ft, 0, SEEK_CUR);
C 标准要求声明。
ISO/IEC 9899:2011 §7.21.5.3 The
fopen
function¶7 When a file is opened with update mode ('+' as the second or third character in the above list of mode argument values), both input and output may be performed on the associated stream. However, output shall not be directly followed by input without an intervening call to the
fflush
function or to a file positioning function (fseek
,fsetpos
, orrewind
), and input shall not be directly followed by output without an intervening call to a file positioning function, unless the input operation encounters end-of- file. Opening (or creating) a text file with update mode may instead open (or create) a binary stream in some implementations.
(强调已添加。)
fgetc()
返回 int
引自 ISO/IEC 9899:2011(当前的 C 标准)。
§7.21 Input/output
<stdio.h>
§7.21.1 Introduction
EOF
which expands to an integer constant expression, with type int and a negative value, that is returned by several functions to indicate end-of-file, that is, no more input from a stream;§7.21.7.1 The
fgetc
function
int fgetc(FILE *stream);
¶2 If the end-of-file indicator for the input stream pointed to by stream is not set and a next character is present, the
fgetc
function obtains that character as anunsigned char
converted to anint
and advances the associated file position indicator for the stream (if defined).Returns
¶3 If the end-of-file indicator for the stream is set, or if the stream is at end-of-file, the end-of-file indicator for the stream is set and the
fgetc
function returns EOF. Otherwise, thefgetc
function returns the next character from the input stream pointed to by stream. If a read error occurs, the error indicator for the stream is set and thefgetc
function returns EOF.289)289) An end-of-file and a read error can be distinguished by use of the
feof
andferror
functions.
所以,EOF
是一个负整数(通常是-1,但标准没有要求)。 fgetc()
函数返回 EOF 或字符值 unsigned char
(范围为 0..UCHAR_MAX,通常为 0..255)。
§6.2.5 Types
¶3 An object declared as type
char
is large enough to store any member of the basic execution character set. If a member of the basic execution character set is stored in achar
object, its value is guaranteed to be nonnegative. If any other character is stored in achar
object, the resulting value is implementation-defined but shall be within the range of values that can be represented in that type.¶5 An object declared as type
signed char
occupies the same amount of storage as a ‘‘plain’’char
object.§6 For each of the signed integer types, there is a corresponding (but different) unsigned integer type (designated with the keyword
unsigned
) that uses the same amount of storage (including sign information) and has the same alignment requirements.§15 The three types
char
,signed char
, andunsigned char
are collectively called the character types. The implementation shall definechar
to have the same range, representation, and behavior as eithersigned char
orunsigned char
.45)45)
CHAR_MIN
, defined in<limits.h>
, will have one of the values0
orSCHAR_MIN
, and this can be used to distinguish the two options. Irrespective of the choice made,char
is a separate type from the other two and is not compatible with either.
这证明了我的断言:简单的 char
可以是有符号或无符号类型。
现在考虑:
char c = fgetc(fp);
if (c == EOF)
…
假设fgetc()
返回 EOF,并且简单 char
是无符号(8 位)类型,EOF 为 -1
。该赋值将值 0xFF 放入 c
,这是一个正整数。进行比较时,c
晋升为int
(因此为值 255),并且 255 不是负数,因此比较失败。
相反,假设简单的 char
是有符号(8 位)类型,字符集为 ISO 8859-15。如果fgetc()
返回 ÿ,分配的值将是位模式 0b11111111,与 -1
相同,因此在比较中,c
将转换为-1
和比较c == EOF
即使读取了有效字符,也会返回 true。
您可以调整细节,但基本论点在 sizeof(char) < sizeof(int)
期间仍然有效。 。有些 DSP 芯片不适用这一点;你必须重新考虑规则。即便如此,基本点依然存在: fgetc()
返回 int
,不是char
.
如果您的数据确实是 ASCII(7 位数据),那么所有字符都在 0..127 范围内,并且您不会遇到 ÿ 的误解问题。但是,如果您的char
类型是无符号的,你仍然有“无法检测EOF”的问题,所以你的程序会运行很长时间。如果你需要考虑可移植性,你就会考虑到这一点。这些是作为 C 程序员需要处理的专业级问题。您可以相对轻松地找到在您的系统上运行的程序来获取数据,而无需考虑所有这些细微差别。但你的程序无法在其他人的系统上运行。
关于c - 修改c中文件的现有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41251178/
我正在为我的按钮使用 onClick 功能。我的按钮代码如下所示: Button 1 Button 2 我的 JS 函数如下所示: function fadeNext(selectedId, spee
首先,我想提一下,我理解每个人在不提供至少一些试验或错误的情况下提出问题的感受,但这纯粹是一种知识需求,话虽如此,我会去提前问。 我一直无法弄清楚如何将保存在 MySQL 表中的 600-1000 个
我想做的事情有点令人困惑,而且我英语不太好,所以我先把代码贴在这里,这样你就可以很容易地理解: 以下是表单内容: Testing for Stackoverflow Option1
我学习 SDL 二维编程已有一段时间了,现在我想创建一个结合使用 SDL 和 OpenGL 的程序。我是这样设置的: SDL_Init(SDL_INIT_VIDEO); window = SDL_Cr
我创建了 2 个 data-* 标签。数据类别和数据标签。单击 href 标签后,我想复制该数据类别和数据标签以形成输入。我的代码是:
我想用 CSS 换行。我正在使用内容。 td:before { content: "Test\A Test2"; } 它不工作。如何正确
这个问题已经有答案了: Java Class that implements Map and keeps insertion order? (8 个回答) 已关闭 6 年前。 我有一个 HashMap
我正在尝试使用 JMeter 执行端到端测试。测试涉及写入SFTP文件夹并从另一个SFTP文件夹读取写入操作生成的文件。 我能够使用 JMeter SSH SFTP 插件连接到 SFTP 文件夹,并能
您好,我有带有标准服务器端 Servlet 的 GWT 客户端。 我可以从 GWT 客户端上传文件并在服务器端读取其内容 我可以将其作为字符串发送回客户端 但是 我有 GWT FormPanel与操作
我在 Plone 4.3.9 中创建了一个自定义类型的灵巧性,称为 PersonalPage,必须只允许在特定文件夹中使用 成员文件夹/用户文件夹 . 在他的 FTI 中,默认情况下 False .
在新(更新)版本的应用程序中更改小部件布局的最佳做法是什么?当新版本提供更新、更好的小部件时,如何处理现有小部件? 最佳答案 我认为您必须向用户显示一个弹出窗口,说明“此版本中的新功能”并要求他们重新
在我的应用程序中,我使用支持 View 寻呼机和 PagerTabStrip。进入查看寻呼机我有一些 fragment ,进入其中一个我正在使用支持卡片 View 。运行应用程序后,所有卡片 View
我有以下布局文件。基本上我有谷歌地图,在左上角我有一个 TextView,我需要在其中每 15 秒保持一次计数器以刷新 map 。布局很好。
我使用如下结构: HashMap > > OverallMap 如果我这样做: OverallMap . clear ( ) clear() 丢弃的所有内容(HashMap 对象、Integer 对
我在数据库中有 1000 张图像。在页面加载时,我随机显示 60 张图片,当用户滚动时,我通过 AJAX 请求添加 20 张图片。 第一种方法 我所做的是将所有图像加载到一个容器中,然后隐藏所有图像并
我正在使用 woocommerce 创建一个网上商店。 我想在每个产品上添加一个包含产品信息的表格,例如颜色、交货时间等等。 但是当我添加这张表时。本产品消失后的所有内容。 我的表的代码: td {
This question already has an answer here: What does an empty value for the CSS property content do?
因此,我正在与我的 friend 一起为 Google Chrome 开发一个扩展程序,对于大多数功能(即日历、设置等),我们打开一个模式,这样我们就不必重定向到另一个页面。当您在内容之外单击时,我们
我将可变高度的 CSS 框设置为在更大的 div 中向左浮动。现在我想添加一个标题,其中文本在框的左侧垂直显示(旋转 90 度),如下面的链接所示(抱歉还不能发布图片)。 http://imagesh
相关页面位于 www.codykrauskopf.com/circus 如果您查看我页面的右侧,在半透明容器和浏览器窗口边缘之间有一个间隙。我看了看,出于某种原因,wrap、main、content
我是一名优秀的程序员,十分优秀!