Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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 尝试跳过时出现问题'\n';在读取txt文件时_C_File_Io - Fatal编程技术网

C 尝试跳过时出现问题'\n';在读取txt文件时

C 尝试跳过时出现问题'\n';在读取txt文件时,c,file,io,C,File,Io,我写了一个非常小的程序来帮助设置txt文件的格式,但是当我试图从输入文件中读取并跳过不需要的“\n”时,我实际上跳过了“\n”之后的下一个字符 我在示例文件中处理的字符如下所示: abcde abc ab abcd while (!feof(fp1)) { ch = fgetc(fp1); if (ch != '\n') { printf("%c",ch); } else { ch = fgetc(fp1); // mov

我写了一个非常小的程序来帮助设置txt文件的格式,但是当我试图从输入文件中读取并跳过不需要的“\n”时,我实际上跳过了“\n”之后的下一个字符

我在示例文件中处理的字符如下所示:

abcde
abc

   ab
abcd
while (!feof(fp1)) {
    ch = fgetc(fp1);
    if (ch != '\n') {
        printf("%c",ch);
    }
    else {
        ch = fgetc(fp1); // move to the next character
        if (ch == '\n') {
            printf("%c",ch);
        }
    }
}
我的代码如下所示:

abcde
abc

   ab
abcd
while (!feof(fp1)) {
    ch = fgetc(fp1);
    if (ch != '\n') {
        printf("%c",ch);
    }
    else {
        ch = fgetc(fp1); // move to the next character
        if (ch == '\n') {
            printf("%c",ch);
        }
    }
}
预期的结果是

abcdeabc
  ababcd
但实际上我得到了

abcdebc
   abbcd
我猜问题出在
ch=fgetc(fp1);//移动到下一个字符

,但我就是找不到一个正确的方法来实现这个想法。

想想你的代码流程(下面编号的行):

当您得到一个换行符,后跟一个非换行符时,流程是(从
else
行开始):
6、7、8、10、11、12、1、2

正是在该序列中执行最后的
2
,有效地丢弃了在
7
中读取的非换行符


如果您的目的是基本上丢弃单个换行符,并将换行符序列(两个或更多)转换为单个换行符序列(a),则可以使用以下伪代码:

set numNewlines to zero
while not end-file:
    get thisChar
    if numNewlines is one or thisChar is not newline:
        output thisChar
    if thisChar is newline:
        increment numNewlines
    else:
        set numNewlines to zero
这将在一个位置读取字符,从而减少由于流混乱而不小心跳过字符的可能性

它还使用新行历史记录来决定打印的内容。它只在新行序列中的第二个匹配项上输出一个新行,忽略第一个和第二个之后的任何一个

这意味着一条新线将永远不会被重复,任何两条或更多的新线将被转换成一条新线


一些实际的C代码演示了这一点(b),如下所示:

#包括
#包括
内部主(空){
//打开文件。
文件*fp=fopen(“testprog.in”,“r”);
如果(fp==NULL){
fprintf(stderr,“无法打开输入文件”\n);
返回1;
}
//逐字处理。
int numNewlines=0;
while(true){
//获取下一个字符,如果没有剩余字符,则停止。
int ch=fgetc(fp);
如果(ch==EOF)中断;
//仅输出换行序列中的第二个换行,
//或任何非nwline。
如果(numNewlines==1 | | ch!='\n'){
putchar(ch);
}
//管理序列信息。
如果(ch='\n'){
++Numnewline;
}否则{
numNewlines=0;
}
}
//干净利落地结束。
fclose(fp);
返回0;
}

(a) 你的问题不清楚你想如何处理三行或更多的新行,所以我不得不做一个假设


(b) 当然,如果您的目的是学习,则不应使用此选项,因为:

  • 如果您亲自尝试并解决任何问题,您将学到更多
  • 教育机构几乎肯定会根据网络搜索检查提交的代码,你可能会因为剽窃而被ping

  • 我只是为了完整性而提供它。

    想想您的代码流程(下面编号的行):

    当您得到一个换行符,后跟一个非换行符时,流程是(从
    else
    行开始):
    6、7、8、10、11、12、1、2

    正是在该序列中执行最后的
    2
    ,有效地丢弃了在
    7
    中读取的非换行符


    如果您的目的是基本上丢弃单个换行符,并将换行符序列(两个或更多)转换为单个换行符序列(a),则可以使用以下伪代码:

    set numNewlines to zero
    while not end-file:
        get thisChar
        if numNewlines is one or thisChar is not newline:
            output thisChar
        if thisChar is newline:
            increment numNewlines
        else:
            set numNewlines to zero
    
    这将在一个位置读取字符,从而减少由于流混乱而不小心跳过字符的可能性

    它还使用新行历史记录来决定打印的内容。它只在新行序列中的第二个匹配项上输出一个新行,忽略第一个和第二个之后的任何一个

    这意味着一条新线将永远不会被重复,任何两条或更多的新线将被转换成一条新线


    一些实际的C代码演示了这一点(b),如下所示:

    #包括
    #包括
    内部主(空){
    //打开文件。
    文件*fp=fopen(“testprog.in”,“r”);
    如果(fp==NULL){
    fprintf(stderr,“无法打开输入文件”\n);
    返回1;
    }
    //逐字处理。
    int numNewlines=0;
    while(true){
    //获取下一个字符,如果没有剩余字符,则停止。
    int ch=fgetc(fp);
    如果(ch==EOF)中断;
    //仅输出换行序列中的第二个换行,
    //或任何非nwline。
    如果(numNewlines==1 | | ch!='\n'){
    putchar(ch);
    }
    //管理序列信息。
    如果(ch='\n'){
    ++Numnewline;
    }否则{
    numNewlines=0;
    }
    }
    //干净利落地结束。
    fclose(fp);
    返回0;
    }
    

    (a) 你的问题不清楚你想如何处理三行或更多的新行,所以我不得不做一个假设


    (b) 当然,如果您的目的是学习,则不应使用此选项,因为:

  • 如果您亲自尝试并解决任何问题,您将学到更多
  • 教育机构几乎肯定会根据网络搜索检查提交的代码,你可能会因为剽窃而被ping

  • 我提供它只是为了完整性。

    非常感谢您,这确实帮助了我!你的假设是正确的,我确实计划这样做。在纠正了我目前的错误后,我会尝试实施你更好的解决方案。我已经解决了这个问题,你的回答为我指明了方向!我确实在学习,但这在某种程度上是我的家庭作业,我的目的只是学习更多关于文件io的知识,所以。。。不用担心,非常感谢,这真的帮了我的忙!你的假设是正确的,我确实计划这样做。在纠正了我目前的错误后,我会尝试实施你更好的解决方案。我已经解决了这个问题,你的回答为我指明了方向!我确实在学习,但这在某种程度上是我的家庭作业,也是我的家庭作业