繁体   English   中英

试图用C语言在文件的每一行末尾写?

[英]Trying to write at end of each line in a File in C Language?

我过去3个小时一直在尝试,一度陷入困境。 我想使用C在文件的每一行之后添加一些内容。

这是我的代码

int main(){

FILE *fp;
char c;
int p;

fp = fopen("example1.txt","r+");

if (fp == 0) {
    perror("No File");
    exit(-1);
}

while ( (c = fgetc(fp)) != EOF) {
    if (c != '\n')
        printf("%c",c);
    else {
        //Going back two points is for '\n'
        fseek(fp,-2,SEEK_CUR);
        fprintf(fp,"=2\n");
    }
}


fclose(fp);
return 0;
}

输入文件:

1+1
1+1
1+1

所需的输出:

1+1=2
1+1=2
1+1=2

实际输出:

1+1=2
=2
=2
=2
=2
=2

执行进入无限循环。

假设您在文件中有一行文本。

1+1

如果将内容按字节看成字符,则会看到:

+---+---+---+----+
| 1 | + | 1 | \n |
+---+---+---+----+

当遇到'\\n' ,您返回两个字符并在文件中打印"=2\\n" 之后,文件的内容将为:

+---+---+---+----+
| 1 | = | 2 | \n |
+---+---+---+----+

fprintf的调用不会更改读取数据的位置。 因此,读取位置在文件的第二个字符'='处。

重复整个过程。 文件内容保留

+---+---+---+----+
| 1 | = | 2 | \n |
+---+---+---+----+

输出继续为

=2

第一行之后。

读取和写入同一文件充满了很多陷阱。 如果将它们分开,会更好。

我曾经遇到过同样的问题。 我得到了它的部分工作。在所需的位置,我用ftell获取当前位置。 我从初始文件大小中减去了这一点,并将其存储在剩余大小变量中。 使用fread,我将该位置后的字符放入缓冲区。 然后在当前位置写入所需的输出,然后将缓冲区中的数据写回到文件中。 这适用于小数据,但是我的代码中有一个我无法解决的错误,导致ftell返回超出范围的值。

可以解释为

如果数据是

+---+---+---+----+
| 1 | + | 1 | \n |
+---+---+---+----+
+---+---+---+----+
| 3 | * | 5 | \n |
+---+---+---+----+

假设文件的大小为'x'。1到1之后。ftell表示,您可以获得当前位置'y'。您必须读取'x'-'y'字符并将其放入缓冲区中。在当前位置所需的输出,然后将缓冲区的内容写回到文件

+---+---+---+----+
| 1 | + | 1 | = | 2
+---+---+---+----+

Buf =
+---+---+---+----+
| \n | 3 | * | 5 |\n
+---+---+---+----+

我认为该解决方案效率低下,因为它涉及许多读取和写入操作,可能不适用于大文件。

除了第一行,您必须重写整个文件。 考虑到任意大文件中的任意长行,尝试就地对现有文件执行此操作实际上非常困难。

因此,编写一个新文件要容易得多。

这样的事情(完全没有任何错误检查):

// open files
FILE *in = fopen( "infile.txt", "r" );
FILE *out = fopen( "infile.txt.tmp", "w+" );
// getline() variables
char *line = NULL;
size_t len = 0UL;
ssize_t result;

// buffer for output line
// (hope it's long enough...)
char buffer[ 1024 ];
for ( ;; )
{
    // getline() makes this so much easier...
    result = getline( &line, &len, in );
    if ( result == -1 )
    {
        break;
    }
    // strip newline
    char *p = strchr( line, '\n' );
    if ( p != NULL )
    {
        *p = '\0';
    }
    // append "=2" to each line
    snprintf( buffer, sizeof( buffer), "%s%s\n", line, "=2" );
    fputs( buffer, out );
}
fclose( in );
fclose( out );
// assume POSIX rename is available
rename( "infile.txt.tmp", "infile.txt" );

逐行读取文件,将新数据追加到每行的末尾,将新行写入新文件 ,然后完成后, rename()新文件rename()更改为旧文件名。

通常,我会在行之间添加空格以提高可读性,但是多余的行会导致滚动条出现在代码上,从而降低了可读性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM