2013-10-03 10 views
5

यह होमवर्क असाइनमेंट का हिस्सा है। खैर, मैं अपने होमवर्क में काम नहीं कर सका, इसलिए मैंने एक स्निपेट निकाला है और यह पता लगाने के लिए इसके साथ मरना शुरू कर दिया है कि क्या गलत है।लिनक्स पर O_APPEND मोड में खोलने का उपयोग करके सी में फ़ाइल कैसे संलग्न करें?

सी में

linux पर मैं खोलने के लिए/एक पाठ फ़ाइल बनाने के लिए, यह करने के लिए कुछ लिखते हैं, इसे बंद, पढ़ने में खोलने/लिख सकते हैं और मोड संलग्न, और फिर इसे के अंत तक कुछ भी संलग्न (कोशिश कर रहा हूँ इस उदाहरण में, स्ट्रिंग ", दोस्त")। कुछ भी जोड़ा जा रहा है, हालांकि, लेकिन लेखन विधि भी एक त्रुटि फेंक नहीं है। मुझे यकीन नहीं है कि क्या हो रहा है।

कोड यह रहा:

#include <stdio.h> 
#include <unistd.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <string.h> 
#include <fcntl.h> 
#include <errno.h> 

#define BUFFSIZE 4096 

int main(){ 
    mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; 

    int fd = open("tempfile.txt", O_RDWR | O_CREAT, mode); 

    char buf[BUFFSIZE] = {'t', 'h', 'y', ' ', 'f', 'a', 'l', 'l'}; 

    size_t n = sizeof(buf); 
    if(write (fd, buf, n) < 0){ 
     printf("Error in write\n"); 
     printf("%s", strerror(errno)); 
     return 1; 
    } 

    close(fd); 

    int fd2 = open("tempfile.txt", O_RDWR | O_APPEND); 

    printf("appending dude:\n"); 
    char buf2[6] = {',', ' ', 'd', 'u', 'd', 'e'}; 
    size_t p = sizeof(buf2); 
    if(write (fd2, buf2, p) < 0){ 
     printf("Error in write\n"); 
     printf("%s", strerror(errno)); 
     return 1; 
    } 

    char buf3[BUFFSIZE]; 
    lseek(fd2, 0, SEEK_SET); 
    if(read (fd2, buf3, BUFFSIZE) < 0){ 
     printf("Error in read\n"); 
     printf("%s", strerror(errno)); 
     return 2; 
    } 
    int i; 
    for (i = 0; i < strlen(buf3); ++i){ 
     printf("%c", buf3[i]); 
    } 
    printf("\n"); 

    close(fd2); 

    return 0; 
} 

मैं इसे किया जा रहा है कुछ अलग संयोजनों के साथ खिलवाड़, मोड चर बदलते S_IRWXU करने से सख्ती से एक अनुमति जारी होने की संभावना को खत्म करने की कोशिश की है | एस_आईआरडब्ल्यूएक्सजी | S_IRWXO, मेरे दूसरे खुले बयान में तीसरे तर्क के रूप में मोड को पास कर रहा है, दूसरे खुले बयान में तीसरे तर्क के रूप में संलग्न मोड को पास करने के लिए, केवल दूसरे खुले बयान में संलग्न मोड में फ़ाइल खोल रहा है,

सर्वश्रेष्ठ मैं इसे APPEND मोड के बिना आरडीडब्ल्यूआर में खोल सकता हूं, और फिर मौजूदा टेक्स्ट पर सीधे लिख सकता हूं ... लेकिन यह वही नहीं है जो मैं चाहता हूं। और ध्यान दें, मुझे चीज की तरह चीजों से अवगत है, लेकिन यहां का उद्देश्य फ़ाइल के अंत में पाठ जोड़ने के लिए एपेंड मोड का उपयोग करना कड़ाई से है। मैं छेड़छाड़ नहीं करना चाहता।

इस पर देख रहे हैं से कोई सुराग? मुझे यकीन है कि कुछ स्पष्ट है जो मुझे समझ में नहीं आता है।

बहुत धन्यवाद।

उत्तर

3

बाइट्स आप लिखने के लिए कोशिश कर रहे हैं की संख्या सही नहीं है,

char buf[BUFFSIZE] = {'t', 'h', 'y', ' ', 'f', 'a', 'l', 'l'}; 
size_t n = sizeof(buf); 
if(write (fd, buf, n) < 0){ 

बजाय कि आप इसी तरह

char buf[BUFFSIZE] = {'t', 'h', 'y', ' ', 'f', 'a', 'l', 'l', '\0'}; 
size_t n = strlen(buf); //use strlen 
if(write (fd, buf, n) < 0){ 

करना चाहिए, अन्य लिखने के लिए ऐसा करते हैं और साथ ही पढ़ता है। यदि आप स्ट्रिंग को समाप्त करने के लिए फ़ाइल में '\0' लिख नहीं रहे हैं, तो आप फ़ाइल से डेटा पढ़ते समय इसे प्राप्त नहीं करेंगे।

पढ़ते समय आपको पूरी फ़ाइल पढ़ने के बाद कोशिश करनी चाहिए, यानी। आपको EOF मिलते हैं।

+0

धन्यवाद! इससे मेरी समस्या हल हो गई, और मुझे उन विशिष्ट परिणामों को मिला जो मैं ढूंढ रहा था। – Deranger

3

ठीक है, मैं सिर्फ अपने कार्यक्रम की कोशिश की और क्या गलत हो रहा है की एक विचार है।

असल में, यह काम करता है, लेकिन एक गड़बड़ के साथ। जब आप पहली बार फाइल में "तेरा गिरावट" लिखते हैं, आप 4096 बाइट्स का एक char सरणी का उपयोग करें, और आप फ़ाइल में पूरे सरणी लिखें। जिसका अर्थ है कि आप "अपनी गिरावट" लिख रहे हैं, इसके बाद 4088 यादृच्छिक कुछ भी नहीं है। बाद में, जब आप संलग्न करते हैं तो आप 40 9 7 वें स्थान पर आगे बढ़ रहे हैं। शायद यह नहीं है कि आप क्या करना चाहते हैं।

आप बस cat आपके द्वारा बनाए गए फ़ाइल, तो आप उम्मीद उत्पादन "तेरा गिरावट, दोस्त" दिखाई देगा। लेकिन जब आप इसे पूरी तरह से अपने कोड में पढ़ते हैं, तो आप केवल 4096 वर्ण पढ़ रहे हैं। इसलिए, ", दोस्त" भाग कभी नहीं पढ़ा जाता है, यही कारण है कि आपका प्रोग्राम इसे कभी भी आउटपुट नहीं करता है।

मेरे समाधान, आप अपने सरणी आकार बदलने के लिए की जरूरत है। और जब पढ़ते हैं, तो 100 या 1000 कहने के भाग में पढ़ें, जब तक आप ईओएफ (read वापस आ जाएंगे)।

+0

मीठे। क्या आप मौके से बिल्ली का उपयोग कैसे करें इसका एक उदाहरण जोड़ सकते हैं? (मैं सी के लिए थोड़ा नया हूं, इसलिए परिचित नहीं है, लेकिन इसे जांच करूँगा ...) – Deranger

+1

'cat' किसी भी लिनक्स शैल पर एक कमांड उपलब्ध है। यदि आप बैश का उपयोग करते हैं, तो बस टर्मिनल खोलें, उस निर्देशिका में बदलें जहां आपका प्रोग्राम रहता है, और 'cat tempfile.txt' करें। – Nikhil

+0

ठीक है - अब मुझे यह काम मिल गया है। मुझे लगता है कि आप और रोहन दोनों जो कह रहे हैं उसके साथ सही हैं, लेकिन सरणी को समाप्त करने और आकार के बजाय स्ट्रेल का उपयोग करने के लिए शून्य वर्ण जोड़ना, क्योंकि रोहन ने मुझे सही परिणाम दिए जो मुझे ढूंढ रहे थे। इसलिए मैं इन दोनों उत्तरों को उखाड़ फेंकने जा रहा हूं लेकिन रोहन का चयन करें जो वास्तव में मेरे मुद्दे का उत्तर देता है। आपकी सहायता के लिए धन्यवाद! – Deranger

1

सिर्फ एक छोटी सी गलती भी नहीं है, तो आप सिर्फ स्ट्रिंग सरणी में संग्रहीत की लंबाई लौट strlen को sizeof समारोह को बदलने के लिए, क्योंकि sizeof समारोह सरणी के आकार लेकिन strlen समारोह वापस आ जाएगी की जरूरत है!

-1

क्यों तुम सिर्फ fopen("text.txt", "a+");

इस लेखन के लिए फ़ाइल को खोलता है और संलग्न कर देगा का उपयोग नहीं है।

संबंधित मुद्दे

 संबंधित मुद्दे