在下面的代码中,我试图存储文件中的所有字符(包括换行符).如果读取换行符,则变量"i"应递增并且"j"复位为0,但这不会发生.我已经确认通过从我的阵列打印到控制台,实际上正在读取和存储换行符.
void scan_solved_nonogram(board *b) {
FILE *file = fopen("test.txt", "r");
int i = 0, j = 0;
while( ( b->symbol[i][j] = getc(file) ) != EOF ) {
j++;
if( b->symbol[i][j] == '\n' ) {
i++;
j = 0;
}
}
fclose(file);
b->size_i = i;
b->size_j = j;
}
Run Code Online (Sandbox Code Playgroud) I/O问题:
我被要求从用户那里获得一个输入并解析它.问题是我的程序应该能够处理任何输入的长度和治疗任何输入线超过256个字符为无效,并据此打印的消息.
目前我正在使用fgets接收输入行并strtok稍后解析它,但这是一个非常长的输入行的问题.
我怎么能解决这个问题?
我的代码到目前为止:
char userInput[1024];
char *token = NULL;
while (!feof(stdin)) {
fflush(stdin);
if (fgets(userInput, 1024, stdin) != NULL) {
token = strtok(userInput, " \t\r\n");
if (token != NULL) {
if (strncmp(userInput, "fiver", 5) == 0) {
printf("5");
}
else if (strncmp(userInput, "four", 4) == 0) { printf("4");}
Run Code Online (Sandbox Code Playgroud) 我有一个问题,其中ftell返回一个不正确的值.我的代码,当在linux上的netbeans中运行时报告正确,但完全相同的代码,在Windows上运行netbeans(使用mingw)报告不正确.文件指针是在BINARY_READ中打开的文件.在我的linux netbeans中,运行我的子程序之后,ftell报告35.在我的windows netbeans中,在调用相同的子程序之后,ftell是3621.我追踪了我的子程序,以下语句似乎导致问题:
if (((header_size = getc (fp)) == EOF) || (header_size == 0))
Run Code Online (Sandbox Code Playgroud)
在我的linux netbeans上,此语句之后的ftell(fp)导致1.但在我的windows netbeans上,此语句后的ftell(fp)为3585.
可能导致问题的原因是什么?
"UNIX环境中的高级编程,第3版",第151页:
getc和之间的区别fgetc是getc可以实现为宏,而fgetc不能实现为宏.这意味着三件事:
- 论证
getc不应该是带有副作用的表达.- 由于
fgetc保证是一个功能,我们可以采取其地址.这允许我们将fgetc作为参数的地址传递给另一个函数.- 呼叫
fgetc可能需要比调用更长的时间getc,因为通常需要更多时间来调用函数.
使用流指针作为参数的函数签名会出现什么"带副作用的表达式"?
#include<stdio.h>
int getc(FILE* stream);
int fgetc(FILE* stream);
Run Code Online (Sandbox Code Playgroud) 我正在尝试从文件中读取每个字符,然后单独使用getc和putc将其打印到屏幕上.这是我的代码,
FILE *fp = fopen("new.txt","r+");
rewind(fp);
while( feof(fp) == 0 )
{
putc( getc(fp) , stdout);
}
Run Code Online (Sandbox Code Playgroud)
当我执行此操作时,它会遇到无限循环.我无法理解当文件只有几行时会发生这种情况.
新手.
我是C初学者,我想连续两次调用ungetc()虽然我知道在常规C中它是不允许的.有人告诉我,我可以修改Fflush()做这项工作,但我不知道该怎么做.
这是我的代码,我Fflush唯一允许的代码,我ungetc()希望它允许两次.
#define altUngetc(c, fp) ((fp)->next > (fp)->buffer && (c) != EOF ? \
*--(fp)->next = (c) : EOF)
int altGetc(ALT_FILE *fp) {
if (fp->next == fp->buffer + fp->bufSize)
altFflush(fp);
return fp->flags & FILE_ATEOF ? EOF : *fp->next++;
}
int altFflush(ALT_FILE *fp) {
int res;
if (fp->fd < 0 || fp->flags & FILE_ATEOF)
return EOF;
if (fp->flags & FILE_READ) {
res = read(fp->fd, fp->buffer, BUF_SIZE);
if (res == 0)
fp->flags |= FILE_ATEOF;
fp->bufSize = …Run Code Online (Sandbox Code Playgroud) 我正在尝试从终端写入文件中的内容.文件正在创建,但内容未写入文件.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main(int argc, char *argv[])
{
FILE *fp;
fp=fopen(argv[1],"w");
char ch;
while((ch=getchar())!=EOF)
{
putc(ch,fp);
}
fclose(fp);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我试图在C中编写一个简单的'cat'克隆.我正在运行Windows 7并使用MinGW编译器.但是,每当我运行程序时,它都会返回文本文件,但每个字符都替换为"☺"字符.先感谢您.
#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
FILE *fp;
int c;
for(i = 1; i < argc; i++)
{
fp = fopen(argv[i], "r");
if(fp == NULL)
{
fprintf(stderr, "cat: can't open %s\n", argv[i]);
continue;
}
while((c = getc(fp) != EOF))
{
putchar(c);
}
fclose(fp);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我想使用Perl计算消息中字符出现的频率.例如,如果字符"a"在消息中出现10次,那么频率将为10.为此,我使用getc函数一次从FILE读取消息.这是我写的片段.我知道,这是非常基本的.但是当我编译时,我收到一个错误:
细节:
#!/usr/bin/perl
use strict;
use warnings;
my $input=$ARGV[0];
open(INPUT,"<$input");
while(<INPUT>
{
my $c=getc(INPUT);
print $c."\n";
}
close(INPUT);
Run Code Online (Sandbox Code Playgroud)
我尝试编译时遇到以下错误:
Use of uninitialized value in print at AccessChar.pl line 13, <INPUT> line 1.
我无法弄清楚,这个脚本有什么问题.有人可以帮我解决这个问题吗?
我甚至尝试使用getcINPUT代替getc(INPUT).在运行此脚本时,我认为我不需要包含任何其他包.