Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.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 - Fatal编程技术网

更改文件上的字符(C编程)

更改文件上的字符(C编程),c,C,嗯……我是C语言编程新手,我正在做一个练习。我需要在一个.txt文件上创建和写入,并将字母(或字符,如果您愿意)更改为字母表中的下一个3。因此,如果我有“Dog”,它需要更改为“Fri”,例如,我当然需要输出它 这就是我现在所拥有的,代码是不完整的,因为我不知道如何更改任何其他字母,因为即使这样也不能正常工作 它创建一个文件,在其中写入一点,关闭它以确保它被正确保存,再次操作它以读取文件,然后继续更改其中的字母 #include<stdio.h> int main(void)

嗯……我是C语言编程新手,我正在做一个练习。我需要在一个.txt文件上创建和写入,并将字母(或字符,如果您愿意)更改为字母表中的下一个3。因此,如果我有“Dog”,它需要更改为“Fri”,例如,我当然需要输出它

这就是我现在所拥有的,代码是不完整的,因为我不知道如何更改任何其他字母,因为即使这样也不能正常工作

它创建一个文件,在其中写入一点,关闭它以确保它被正确保存,再次操作它以读取文件,然后继续更改其中的字母

#include<stdio.h> 

int main(void) 
{ 
    char c;
    FILE *fp;
    fp=fopen("file1.txt","w");

    fprintf(fp,"Hello World");
    fprintf(fp,"HELLO WORLD");

    fclose(fp);
    fp=fopen("file1.txt","r");

    while(c!=EOF){
        c=getc(fp);
        if(c=="x"){
            c="a";
        }else if(c=="y"){
            c="b";
        }else if(c=="z"){
            c="c";
        }else if(c=="X"){
            c="A";
        }else if(c=="Y"){
            c="B";
        }else(c=="Z"){
            c="C";
        }
        putchar(c);

    }

    fp=fopen("file1.txt","r");
    fclose(fp);

    return 0; 
}
#包括
内部主(空)
{ 
字符c;
文件*fp;
fp=fopen(“file1.txt”,“w”);
fprintf(fp,“你好世界”);
fprintf(fp,“你好世界”);
fclose(fp);
fp=fopen(“file1.txt”,“r”);
而(c!=EOF){
c=getc(fp);
如果(c==“x”){
c=“a”;
}否则,如果(c==“y”){
c=“b”;
}否则,如果(c==“z”){
c=“c”;
}否则,如果(c==“X”){
c=“A”;
}否则,如果(c==“Y”){
c=“B”;
}其他(c==“Z”){
c=“c”;
}
普查尔(c);
}
fp=fopen(“file1.txt”,“r”);
fclose(fp);
返回0;
}
更新/编辑:

好的,我已经设法做到了,我没有完全理解我应该在代码中改变什么,或者在代码中把你的答案放在哪里,所以我在这里尝试了一个信念的飞跃,从你的建议中我了解到,字符c可以作为一个8位整数处理,所以我只是在检查了所有其他if语句后尝试了c+=3。代码现在起作用了

#include<stdio.h> 

int main(void) 
{ 
    char c;
    FILE *fp;
    fp=fopen("file1.txt","w");

    fprintf(fp,"Hello World");
    fprintf(fp,"HELLO WORLD");

    fclose(fp);
    fp=fopen("file1.txt","r");

    while((c=getc(fp))!=EOF){
        if (!isalnum(c))
            continue;

        if(c=='x'){
            c='a';
        }else if(c=='y'){
            c='b';
        }else if(c=='z'){
            c='c';
        }else if(c=='X'){
            c='A';
        }else if(c=='Y'){
            c='B';
        }else if(c=='Z'){
            c='C';
        }else{
            c+=3;
        }
        putchar(c);

    }

    fclose(fp);

    return 0; 
}
#包括
内部主(空)
{ 
字符c;
文件*fp;
fp=fopen(“file1.txt”,“w”);
fprintf(fp,“你好世界”);
fprintf(fp,“你好世界”);
fclose(fp);
fp=fopen(“file1.txt”,“r”);
而((c=getc(fp))!=EOF){
如果(!isalnum(c))
持续
如果(c=='x'){
c='a';
}else如果(c=='y'){
c='b';
}else如果(c=='z'){
c='c';
}else如果(c=='X'){
c='A';
}else如果(c=='Y'){
c='B';
}else如果(c=='Z'){
c='c';
}否则{
c+=3;
}
普查尔(c);
}
fclose(fp);
返回0;
}

谢谢各位的建议。它们帮了我很大的忙,我知道if语句本可以更好一点,但我对这类东西还是新手。

我认为实现这一点的最简单方法是在字符值中添加3。棘手的部分是当您的偏移量从字母表上脱落时(例如,您将ascii
z
偏移3,您将得到
}

您可以尝试以下方法:

if ( (c >= 'a') && (c <= 'z') )
{
  c += 3;
  if (c > 'z') // If the character falls off the alphabet, Start over at 'a'
    c = c - 'z' + 'a';
}
if ( (c >= 'A') && (c <= 'Z') )
{
  c += 3;
  if (c > 'Z') // If the character falls off the alphabet, Start over at 'a'
    c = c - 'Z' + 'A';
}
int c;

while((c = fgetc(fp_in)) != EOF)
{
  if(islower(c))
  {
    const int loc = c - 'a'; /* Non-portable! */
    loc = (loc + 3) % 26;
    c = 'a' + loc;
  }
  else if(isupper(c))
  {
    const int loc = c - 'A'; /* Non-portable! */
    loc = (loc + 3) % 26;
    c = 'A' + loc;
  }
  putc(c, fp_out);
}
if((c>='a')&&&(c'z')//如果字符从字母表上脱落,请从'a'处重新开始
c=c-‘z’+‘a’;
}
if((c>='A')&&&(c'Z')//如果字符从字母表上脱落,请从'A'处重新开始
c=c-‘Z’+‘A’;
}

这里
c
是您正在修改的字符。

如果您想将a映射到d、b映射到e、.x映射到a、y映射到b、z映射到c,您可以尝试以下操作:

if ((c >= 'a') && (c <= 'z')) {
 c += 3;
}

if (c > 'z') {
 c = 'a' + (c - 'z' - 1);
}
另外,正如其他人所指出的,字符文字用单引号括起来

编辑: 您应该在while循环中包含此代码,该循环从文件中逐字符读取,如下所示:

while ((c = fgetc(fpRead)) != EOF) { //file pointer to read
 if ((c >= 'a') && (c <= 'z')) {
  c += 3;
 }

 if (c > 'z') {
  c = 'a' + (c - 'z' - 1);
 }
 putc(c,fpWrite); //different file to write to
}
while((c=fgetc(fpRead))!=EOF){//要读取的文件指针
如果((c>='a')&&(c'z')){
c='a'+(c-'z'-1);
}
putc(c,fpWrite);//要写入的不同文件
}

正如@unwind所指出的,在读取和写入同一个文件时,您必须小心。我认为这不是您的意图。如果您想重写同一个文件,请将其读入数组。然后以“w”模式打开该文件,将数组写入该文件。前面的内容将被重写。

请注意,您无法进行比较
EOF
与类型为
char
的值相比,它不适合。您需要
int

大概是这样的:

if ( (c >= 'a') && (c <= 'z') )
{
  c += 3;
  if (c > 'z') // If the character falls off the alphabet, Start over at 'a'
    c = c - 'z' + 'a';
}
if ( (c >= 'A') && (c <= 'Z') )
{
  c += 3;
  if (c > 'Z') // If the character falls off the alphabet, Start over at 'a'
    c = c - 'Z' + 'A';
}
int c;

while((c = fgetc(fp_in)) != EOF)
{
  if(islower(c))
  {
    const int loc = c - 'a'; /* Non-portable! */
    loc = (loc + 3) % 26;
    c = 'a' + loc;
  }
  else if(isupper(c))
  {
    const int loc = c - 'A'; /* Non-portable! */
    loc = (loc + 3) % 26;
    c = 'A' + loc;
  }
  putc(c, fp_out);
}
注:以上是不可移植的,因为它假设字符A-Z和A-Z在相邻位置进行编码。这是而不是由C保证的,因此代码将在使用此类字符集的系统上中断。对于使用某种ASCII(或UTF-8)派生码的典型现代系统,它将起作用

显然,在上/下分支中也存在大量重复,可以进行重构


请注意,上面使用了两个
文件*
指针,因为您不能读写同一个文件并就地覆盖。

为什么所有
if
s?您可以执行类似
的操作,如果(c>='a'&&c
c
是char变量,而
“Z”
是char*(一种字符串)文字。您应该使用
'z'
等。
“x”
的类型是
char*
,而不是
char
。将其更改为
'x'
开始。对所有其他字母都执行相同的操作。这里有一个小提示,不需要执行if/switch语句,例如:
char c='a';printf(“c:%c\n”,c+3)
F在字母表中与D的距离不是三个字母,I和J也一样。你的意思是“Grj”吗?好吧,让我测试一下这个,我不知道我可以像数字一样使用字符c。(我的意思是<和>)。一个字符实际上是一个有符号的8位整数。因此,在任何可以使用数字的操作中都可以使用字符。嗯..这不起作用,我认为最好检查字符c是否不是结尾字母(x、y或z)之一首先,如果没有,那么我就使用普通方法。@TamásSzabó它的实现定义了
char
是有符号的还是无符号的,它的大小是
char\u BIT
bits。@unwind:谢谢澄清。到目前为止,我使用的每个平台上都有8位签名。但老实说,我从未检查过规范。