Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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 如何一次读取3个字符的文本文件?_C_Ascii_Fgetc - Fatal编程技术网

C 如何一次读取3个字符的文本文件?

C 如何一次读取3个字符的文本文件?,c,ascii,fgetc,C,Ascii,Fgetc,我正在学习用C语言编程,现在我的家庭作业是这样的。我应该能够获取一个包含单词/字母的文本文件,我的程序应该打印ascii码+1个字母。它正在“编码”它。例如,字母“A”将打印为066。所以我的问题是程序也需要能够将ascii码解码回字母,但我不知道如何让我的程序一次读取3个数字。我曾经 c = fgetc(pF); while (c != EOF) { fprintf(pF2,"%03i",c+1); c = fgetc(pF); 一次读取一个字符的文件。我应该使用类似的方法来获

我正在学习用C语言编程,现在我的家庭作业是这样的。我应该能够获取一个包含单词/字母的文本文件,我的程序应该打印ascii码+1个字母。它正在“编码”它。例如,字母“A”将打印为066。所以我的问题是程序也需要能够将ascii码解码回字母,但我不知道如何让我的程序一次读取3个数字。我曾经

c = fgetc(pF);  
while (c != EOF) {  
fprintf(pF2,"%03i",c+1); 
c = fgetc(pF);  
一次读取一个字符的文件。我应该使用类似的方法来获得我需要的3个数字,还是完全不同

#include "stdio.h"
#include "stdlib.h"

int encode(){
char * fName = "testR.txt";
char * fName2="testW.txt";
FILE * pF;
FILE * pF2;
char c, cArray[500];
int i=0;

pF = fopen(fName, "r");
if ( pF == NULL ) {
    printf("Error: The specified file could not be opened.\n");
    return -1;
}
pF2 = fopen(fName2, "w");

c = fgetc(pF);
while (c != EOF) {
fprintf(pF2,"%03i",c+1);
    c = fgetc(pF);
}
fclose(pF); 
fclose(pF2);
return;
}

char decode(){
char * fName = "testW.txt";
char * fName2="testW2.txt";
char * buf;
FILE * pF;
FILE * pF2;
char  cArray[500];
char buffer[4];
     buffer[3] = '\0';

pF = fopen(fName, "r");
if ( pF == NULL ) {
    printf("Error: The specified file could not be opened.\n");
    return -1;
}
pF2 = fopen(fName2, "w");
while (fread(buffer, 3, 1, stdin)){
putchar((atoi(buffer)-1) & 0xFF);
}
fclose(pF); 
fclose(pF2);
}

int main (int argc, char *argv[]){
char c;

if ( argc != 2 ) { 
  printf("Incorrect number of arguments.\n"); 
  exit(-1); 
} 

if (strcmp(argv[1], "-e") == 0){
   encode();
   }
if (strcmp(argv[1], "-d") == 0){
   decode();
   }
return 0;
}
我意识到我的代码乱七八糟,可能有一些东西不应该出现在我尝试进行的所有更改中=[/p>编码:

while (fread(buf, 1, 3, pF) == 3) 
{
  ...
}
int c;

while ((c = getchar()) != EOF)
    printf("%.3d", (c+1)&0xFF);
解码:

char buffer[4];
buffer[3] = '\0';

while (fread(buffer, 3, 1, stdin))
    putchar((atoi(buffer)-1) & 0xFF);
从技术上讲,如果编码时输出不以换行符结束,则输出不是文本文件。对输入没有错误检查。
fread()
在读取三个字符组时将返回1;否则,将返回0

工作程序 e3.c-加密
#包括
内部主(空)
{
INTC;
而((c=getchar())!=EOF)
printf(“%.3d”,(c+1)和0xFF);
返回0;
}
d3.c-解密
#包括
#包括
内部主(空)
{
字符缓冲区[4];
缓冲区[3]='\0';
while(fread(缓冲区,3,1,标准输入))
putchar((atoi(缓冲区)-1)和0xFF);
返回0;
}
样本输出
$e3
行末的美元是提示

$ e3 <e3.c | d3
#include <stdio.h>

int main(void)
{
    int c;

    while ((c = getchar()) != EOF)
        printf("%.3d", (c+1)&0xFF);
    return 0;
}

$ e3 <e3.c | d3 | diff e3.c -
$
$e3编码:

int c;

while ((c = getchar()) != EOF)
    printf("%.3d", (c+1)&0xFF);
解码:

char buffer[4];
buffer[3] = '\0';

while (fread(buffer, 3, 1, stdin))
    putchar((atoi(buffer)-1) & 0xFF);
从技术上讲,如果编码时输出不以换行符结束,则输出不是文本文件。对输入没有错误检查。
fread()
在读取三个字符组时将返回1;否则,将返回0

工作程序 e3.c-加密
#包括
内部主(空)
{
INTC;
而((c=getchar())!=EOF)
printf(“%.3d”,(c+1)和0xFF);
返回0;
}
d3.c-解密
#包括
#包括
内部主(空)
{
字符缓冲区[4];
缓冲区[3]='\0';
while(fread(缓冲区,3,1,标准输入))
putchar((atoi(缓冲区)-1)和0xFF);
返回0;
}
样本输出
$e3
行末的美元是提示

$ e3 <e3.c | d3
#include <stdio.h>

int main(void)
{
    int c;

    while ((c = getchar()) != EOF)
        printf("%.3d", (c+1)&0xFF);
    return 0;
}

$ e3 <e3.c | d3 | diff e3.c -
$

$e3 fread(buf,1,3,pF);我还会使用(c!=EOF)?否。首先声明buf,然后使用fread。thes从pF中读取3个字符,并将其存储在buf中。该函数返回与第3个参数count相关的读取元素数。通常,当返回值和计数不匹配时,会出现错误。好的,我想我有这个错误,但如何使其循环读取整个文件?fread(buf,1,3,pF);我还会使用(c!=EOF)?否。首先声明buf,然后使用fread。thes从pF读取3个字符,并将其存储在buf中。该函数返回与第3个参数count相关的读取元素数。通常,当返回值和count不匹配时,会出现错误。好的,我想我有这个错误,但如何使其循环读取整个文件?如果file是纯ASCII文本;读取单个字符需要读取一个字节,而不是三个字节。明白了,我觉得很傻。所以程序现在生成了我试图生成的文件,但其中没有任何内容,并且程序没有真正正确终止。读取的三个字符是否存储在buf中,或者如果没有,是否有地方可以访问它们?因为我需要将它们从ascii码转换回字符。从文件中读取的三个字符存储在
buf
中,必须将其定义为字符数组(例如
char buf[3]
)。因此,在您的示例中,如果您的输入文件具有字符
066
,则在调用fread后,
buf[0]
将包含字符
0
buf[1]
将包含字符
6
buf[2]
将包含字符
6
@KenWhite,据我所知,op将字符值编码为3位字符串,即“%03i”。这当然需要读取3个字符。行终止似乎不是问题,因此二进制/文本到目前为止是不相关的。假设这与OP的输入文件的编码一致,唯一的主要问题是大小/计数参数到
fread
的顺序。如果确实如所述,“项”被读取正好是三个字符,因此部分读取是一个失败条件。因此,这应该在(fread(buf,3,1,pF)==1)
时读取
。所有这些都假设它是OP想要的格式(老实说,我对此表示怀疑,因为它不考虑空格、行分隔符等。如果不知道文件格式,就不可能准确回答)。如果文件是纯ASCII文本,这是完全错误的;读取单个字符需要读取一个字节,而不是三个字节。明白了,我觉得很傻。所以程序现在生成了我试图生成的文件,但其中没有任何内容,程序也没有正确终止。正在读取的三个字符是否存储在buf中,或者如果没有,是否有其他原因E