簡體   English   中英

C-函數read(文件,緩沖區,要讀取的字節)破壞字符串

[英]C - Function read(file,buffer,bytes to read) breaking a string

我正在嘗試讀取包含1024行的文件,每行有9倍相同的字母,如果找到的行與此條件不匹配,則返回該文件。

該文件如下,但具有1024行:

eeeeeeeee
eeeeeeeee
eeeeeeeee

碼:

fd = open(fileName, O_RDONLY);
lseek(fd,0,SEEK_SET);


if(flock(fd, LOCK_SH) == -1)
        perror("error on file lock");

if(fd != 0){

    read(fd, lineFromFile, (sizeof(char)*10));
    arguments->charRead = lineFromFile[0];

    for(i=0; i < 1024; i++){        
        var = read(fd, toReadFromFile, (sizeof(char)*10));  
        if(strncmp(toReadFromFile,lineFromFile,10) != 0 || var < 10){           

            arguments->result = -1;
            printf("%s \n\n",toReadFromFile);
            printf("%s \n",lineFromFile);
            printf("i %d var %d  \n",i,var);                
            free(toReadFromFile);
            free(lineFromFile);
            return ;
        }                       
    }
}

輸出:

> eeeee
eeee 

eeeee
eeee 
i 954 var 6 

我有5個帶有不同字母的文件,每個文件在該特定行(954)中都給出此輸出,該行是正確的,該字母寫了9次,最后帶有\\ n。

任何想法為什么會發生這種情況? 如果我不使用lseek,它可以正常工作,但是我需要lseek將文件分為幾個部分,以通過不同的線程進行測試。 為了簡化起見,我將0索引放在lseek中以示大家。

謝謝。

看起來您正在尋找"eeeee\\neeee"而不是"eeeeeeeee\\n" 這意味着您的文件應該這樣開始:

eeeee
eeeeeeeee
eeeeeeeee

像這樣結束:

eeeeeeeee
eeee

如果文件以這種方式結束:

eeeeeeeee
eeeeeeeee

然后,當您到達最后一行時,它將失敗,因為您只會讀取"eeeee\\n"而不是"eeeee\\neeee"

鑒於您評論中的新信息,我相信問題是您不應該尋求中間的問題(在本例中為342和684)。 您應該尋求預期字符串的偶數倍(例如340和680)。 同樣,第954行也不是問題發生的地方。 它應該是954 + X行,其中X是您要搜索的行。

無論您的程序有任何其他問題,它肯定具有以下特點: read()函數不能保證讀取請求的全部字節數。 除非遇到錯誤或文件末尾,否則它將至少讀取一個,並且在許多情況下,它會讀取請求的全部字節數,但是即使文件末尾還有足夠的字節數,也要read()讀取的字節可能少於請求的字節。

強烈建議您考慮使用更高級別的函數的注釋,但是如果由於某種原因您不得不使用read()則必須注意讀取的字節數少於請求的字節數,並通過讀取其他字節來處理它們進入緩沖區未使用的尾端。 可能多次。

在函數形式中,可能如下所示:

int read_all(int fd, char buf[], int num_to_read) {
    int total_read = 0;
    int n_read = 0;

    while (total_read < num_to_read) {
        n_read = read(fd, buf + total_read, num_to_read - total_read);
        if (n_read > 0) {
            total_read += n_read;
        } else {
            break;
        }
    }

    return (n_read < 0) ? n_read : total_read;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM