簡體   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