我正在阅读C语言程序,并且到目前为止已经理解了所有内容.然而,当我遇到getchar()并且putchar(),我无法理解它们的用途,更具体地说,以下代码的作用.
main()
{
int c;
while ((c = getchar()) != EOF)
putchar(c);
}
Run Code Online (Sandbox Code Playgroud)
我理解main()函数,整数的声明c和while循环.然而我对while循环中的条件感到困惑.这个C代码的输入是什么,输出是什么.
对不起,如果这是一个基本而愚蠢的问题,但我只是在寻找一个简单的解释,然后再继续阅读本书并变得更加困惑.
我有一个文本文件,每行都有字符串.我想为文本文件中的每一行增加一个数字,但是当它到达文件的末尾时,它显然需要停止.我曾尝试对EOF进行一些研究,但无法真正理解如何正确使用它.
我假设我需要一个while循环,但我不知道该怎么做.
我有这个但是一旦它到达假定的EOF它再次重复循环和scanf.
int main(void)
{
char words[16];
while(scanf("%15s", words) == 1)
printf("%s\n", words);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 从IntelliJ IDEA运行命令行Java应用程序时,是否可以将EOF符号发送到等待输入的程序?在控制台中,这可以使用ctrl-d组合完成,但在IDEA中它不起作用.
我试图设置vim跳过在最后一行或eof上添加eol,我试过这个
:set binary
:set noeol
:w
Run Code Online (Sandbox Code Playgroud)
这不完美导致二进制覆盖文件类型供以后使用.
设置此项的任何其他选项,我不需要在最后一行换行.
所以我使用过eof()的功能在我的很多程序,需要文件输入的,我的教授说,这是蛮好用的,但有几个人在等纷纷表示,我不应该没有真正指定的原因使用它.所以我想知道,有充分的理由吗?
我在运行这部分代码时遇到错误.尝试了一些现有的解决方案,但都没有帮助
elec_and_weather = pd.read_csv(r'C:\HOUR.csv', parse_dates=True,index_col=0)
# Add historic DEMAND to each X vector
for i in range(0,24):
elec_and_weather[i] = np.zeros(len(elec_and_weather['DEMAND']))
elec_and_weather[i][elec_and_weather.index.hour==i] = 1
# Set number of hours prediction is in advance
n_hours_advance = 24
# Set number of historic hours used
n_hours_window = 24
for k in range(n_hours_advance,n_hours_advance+n_hours_window):
elec_and_weather['DEMAND_t-%i'% k] = np.zeros(len(elec_and_weather['DEMAND']))'
Run Code Online (Sandbox Code Playgroud)
我总是得到这个错误
for i in range(0,24):
File "<ipython-input-29-db3022a769d1>", line 1
for i in range(0,24):
^
SyntaxError: unexpected EOF while parsing
File "<ipython-input-25-df0a44131c36>", line 1
for k in range(n_hours_advance,n_hours_advance+n_hours_window): …Run Code Online (Sandbox Code Playgroud) 我读过那个<fstream>早期的<exception>.忽略了例外fstream情况不是很有用的事实,我有以下问题:
可以使用该exceptions()方法在文件流上启用异常.
ifstream stream;
stream.exceptions(ifstream::failbit | ifstream::badbit);
stream.open(filename.c_str(), ios::binary);
Run Code Online (Sandbox Code Playgroud)
任何尝试打开不存在的文件,没有正确权限的文件或任何其他I/O问题都将导致异常.使用自信的编程风格非常好.该文件应该在那里并且可读.如果条件不满足,我们会得到例外.如果我不确定文件是否可以安全打开,我可以使用其他功能来测试它.
但现在假设我尝试读取缓冲区,如下所示:
char buffer[10];
stream.read(buffer, sizeof(buffer));
Run Code Online (Sandbox Code Playgroud)
如果流在填充缓冲区之前检测到文件结束,则流决定设置failbit,如果启用了异常,则会触发异常.为什么?这有什么意义?我本可以eof()在阅读后验证只是测试:
char buffer[10];
stream.read(buffer, sizeof(buffer));
if (stream.eof()) // or stream.gcount() != sizeof(buffer)
// handle eof myself
Run Code Online (Sandbox Code Playgroud)
这种设计选择使我无法在流上使用标准异常,并迫使我在权限或I/O错误上创建自己的异常处理.或者我错过了什么?有什么出路吗?例如,我可以轻松测试是否可以sizeof(buffer)在流之前读取字节数吗?
我已经掌握了这个知识,这EOF是一个在文本文件末尾自动插入的特殊字符,以表明它的结束.但我现在觉得有必要对此作一些澄清.我检查了谷歌和维基百科页面,EOF但他们无法回答以下内容,并且没有确切的Stack Overflow链接.所以请帮助我:
我的书说二进制模式文件根据文件目录条目中存在的字符数来跟踪文件的结尾.(与具有特殊EOF字符标记结尾的文本文件形成对比).那么EOF二进制文件的上下文是什么?我很困惑,因为在以下程序中,我在二进制模式下!=EOF从.exe文件读取时成功使用了比较:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int ch;
FILE *fp1,*fp2;
fp1=fopen("source.exe","rb");
fp2=fopen("dest.exe","wb");
if(fp1==NULL||fp2==NULL)
{
printf("Error opening files");
exit(-1);
}
while((ch=getc(fp1))!=EOF)
putc(ch,fp2);
fclose(fp1);
fclose(fp2);
}
Run Code Online (Sandbox Code Playgroud)是EOF一个特殊的"角色"吗?或者它是一个条件为维基说,当计算机知道何时返回像一个特定值的情况-1(EOF我的电脑上)?这种"条件"的例子是当字符读取功能完成读取所有存在的字符,或者字符/字符串I/O功能在读/写时遇到错误时?
有趣的是,Stack Overflow标签用于EOF混合那些定义 EOF.EOF所述"在编程领域中的标签,EOF是一个字节序列(或一个字符),表示此后没有更多的内容." 虽然它在"约"部分也说过" 文件结尾(通常缩写为EOF)是计算机操作系统中不能从数据源读取数据的条件.数据源通常称为文件或流."
但我强烈的感觉EOF不会是一个角色,因为在I/O期间遇到错误时,其他所有函数似乎都会返回它.
如果你能为我解决这个问题,那将是非常好的.
eof ×10
c ×4
c++ ×2
file ×2
python ×2
binaryfiles ×1
end-of-line ×1
fstream ×1
getchar ×1
lint ×1
nonblocking ×1
putchar ×1
python-3.6 ×1
python-3.x ×1
scanf ×1
vim ×1